W3Cschool
恭喜您成為首批注冊(cè)用戶(hù)
獲得88經(jīng)驗(yàn)值獎(jiǎng)勵(lì)
子類(lèi)可以從超類(lèi)繼承。超類(lèi)也稱(chēng)為基類(lèi)或父類(lèi)。子類(lèi)也稱(chēng)為派生類(lèi)或子類(lèi)。
從另一個(gè)類(lèi)繼承一個(gè)類(lèi)非常簡(jiǎn)單。我們?cè)谧宇?lèi)的類(lèi)聲明中使用關(guān)鍵字extends,后跟超類(lèi)名稱(chēng)。
Java不支持多重繼承的實(shí)現(xiàn)。
Java中的類(lèi)不能有多個(gè)超類(lèi)。
一般的語(yǔ)法是
<class modifiers>class <SubclassName> extends <SuperclassName> { // Code for the Subclass }
以下代碼顯示如何使用從Employee類(lèi)創(chuàng)建Manager類(lèi)。
class Employee { private String name = "Unknown"; public void setName(String name) { this.name = name; } public String getName() { return name; } } class Manager extends Employee { } public class Main { public static void main(String[] args) { // Create an object of the Manager class Manager mgr = new Manager(); // Set the name of the manager mgr.setName("Tom"); // Get the name of the manager String mgrName = mgr.getName(); // Display the manager name System.out.println("Manager Name: " + mgrName); } }
上面的代碼生成以下結(jié)果。
我們沒(méi)有為Manager類(lèi)編寫(xiě)任何代碼,它的工作原理與Employee類(lèi)相同,因?yàn)樗^承自Employee類(lèi)。
您可以使用Manager類(lèi)的構(gòu)造函數(shù)創(chuàng)建一個(gè)管理器對(duì)象。
Manager mgr = new Manager();
創(chuàng)建管理器對(duì)象后,Manager對(duì)象的工作方式與Employee對(duì)象相同。
我們對(duì)manager對(duì)象使用了setName()和getName()方法。
mgr.setName("Tom"); String mgrName = mgr.getName();
Manager類(lèi)不聲明setName()和getName()方法。Manager類(lèi)“擴(kuò)展Employee"。
當(dāng)一個(gè)類(lèi)從另一個(gè)類(lèi)繼承時(shí),它繼承它的超類(lèi)成員,實(shí)例變量,方法等。
對(duì)象類(lèi)是默認(rèn)超類(lèi)。
所有類(lèi)都隱式繼承自O(shè)bject類(lèi)。因此所有類(lèi)的對(duì)象都可以使用Object類(lèi)的方法。
public class P { }
類(lèi)P從Object擴(kuò)展,即使我們沒(méi)有指定父類(lèi)。
Object類(lèi)聲明了hashCode()和toString()方法。因?yàn)镋mployee類(lèi)是Object類(lèi)的一個(gè)子類(lèi),它可以使用這些方法。
Employee emp = new Employee(); int hc = emp.hashCode(); String str = emp.toString();
Employee類(lèi)不使用extends子句指定其超類(lèi)。這意味著它繼承自O(shè)bject類(lèi)。
Object類(lèi)聲明了hashCode()和toString()方法。因?yàn)镋mployee類(lèi)是Object類(lèi)的一個(gè)子類(lèi),它可以使用這些方法。
現(xiàn)實(shí)世界中的“is-a”關(guān)系在軟件中轉(zhuǎn)化為繼承類(lèi)層次結(jié)構(gòu)。
例如,Manager是特定類(lèi)型的Employee。 Employee是一種特定類(lèi)型的Object。
當(dāng)您在繼承層次結(jié)構(gòu)中向上移動(dòng)時(shí),將從特定類(lèi)型移動(dòng)到更一般的類(lèi)型。
從子類(lèi)到超類(lèi)的賦值稱(chēng)為上轉(zhuǎn)換,它在Java中始終允許。
class Employee { private String name = "Unknown"; public void setName(String name) { this.name = name; } public String getName() { return name; } } class Manager extends Employee { } public class Main { public static void printName(Employee emp) { String name = emp.getName(); System.out.println(name); } public static void main(String[] args) { Employee emp = new Employee(); emp.setName("Tom"); Manager mgr = new Manager(); mgr.setName("Jack"); // Inheritance of setName() at work // Print names printName(emp); printName(mgr); // Upcasting at work } }
為子類(lèi)變量分配超類(lèi)引用稱(chēng)為向下轉(zhuǎn)換。
向下轉(zhuǎn)換與向上轉(zhuǎn)換相反。
在向上轉(zhuǎn)換中,賦值向上移動(dòng)類(lèi)層次結(jié)構(gòu),而在向下轉(zhuǎn)換中,賦值向下移動(dòng)類(lèi)層次結(jié)構(gòu)。
我們必須在向下轉(zhuǎn)換中使用類(lèi)型轉(zhuǎn)換。
Manager mgr = (Manager)emp; // OK. Downcast at work
上面的代碼生成以下結(jié)果。
Java instanceof運(yùn)算符幫助我們確定引用變量是否有對(duì)類(lèi)或子類(lèi)的引用。
它需要兩個(gè)操作數(shù),并計(jì)算為布爾值true或false。
它的語(yǔ)法是
<Class Reference Variable> instanceof <Class Name or Interface>如果<Class Reference Variable>引用類(lèi)<Class Name>或其任何后代的對(duì)象,instanceof返回true。
如果引用變量為null,instanceof總是返回false。
我們應(yīng)該在向下轉(zhuǎn)換之前使用instanceof運(yùn)算符。
Manager mgr = new Manager(); Employee emp = mgr; if (emp instanceof Manager) { // downcast will succeed mgr = (Manager)emp; }else { // emp is not a Manager type }
我們可以通過(guò)聲明類(lèi)final來(lái)禁用子類(lèi)。
最終的類(lèi)不能被子類(lèi)化。
下面的代碼聲明了一個(gè)名為MyClass的最終類(lèi):
public final class MyClass{ }
我們也可以聲明一個(gè)方法為final。最終方法不能被子類(lèi)覆蓋或隱藏。
public class A { public final void m1() { } public void m2() { } }
Copyright©2021 w3cschool編程獅|閩ICP備15016281號(hào)-3|閩公網(wǎng)安備35020302033924號(hào)
違法和不良信息舉報(bào)電話(huà):173-0602-2364|舉報(bào)郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號(hào)
聯(lián)系方式:
更多建議: