W3Cschool
恭喜您成為首批注冊(cè)用戶
獲得88經(jīng)驗(yàn)值獎(jiǎng)勵(lì)
子類可以從超類繼承。超類也稱為基類或父類。子類也稱為派生類或子類。
從另一個(gè)類繼承一個(gè)類非常簡單。我們?cè)谧宇惖念惵暶髦惺褂藐P(guān)鍵字extends,后跟超類名稱。
Java不支持多重繼承的實(shí)現(xiàn)。
Java中的類不能有多個(gè)超類。
一般的語法是
<class modifiers>class <SubclassName> extends <SuperclassName> { // Code for the Subclass }
以下代碼顯示如何使用從Employee類創(chuàng)建Manager類。
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é)果。
我們沒有為Manager類編寫任何代碼,它的工作原理與Employee類相同,因?yàn)樗^承自Employee類。
您可以使用Manager類的構(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類不聲明setName()和getName()方法。Manager類“擴(kuò)展Employee"。
當(dāng)一個(gè)類從另一個(gè)類繼承時(shí),它繼承它的超類成員,實(shí)例變量,方法等。
對(duì)象類是默認(rèn)超類。
所有類都隱式繼承自O(shè)bject類。因此所有類的對(duì)象都可以使用Object類的方法。
public class P { }
類P從Object擴(kuò)展,即使我們沒有指定父類。
Object類聲明了hashCode()和toString()方法。因?yàn)镋mployee類是Object類的一個(gè)子類,它可以使用這些方法。
Employee emp = new Employee(); int hc = emp.hashCode(); String str = emp.toString();
Employee類不使用extends子句指定其超類。這意味著它繼承自O(shè)bject類。
Object類聲明了hashCode()和toString()方法。因?yàn)镋mployee類是Object類的一個(gè)子類,它可以使用這些方法。
現(xiàn)實(shí)世界中的“is-a”關(guān)系在軟件中轉(zhuǎn)化為繼承類層次結(jié)構(gòu)。
例如,Manager是特定類型的Employee。 Employee是一種特定類型的Object。
當(dāng)您在繼承層次結(jié)構(gòu)中向上移動(dòng)時(shí),將從特定類型移動(dò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 } }
為子類變量分配超類引用稱為向下轉(zhuǎn)換。
向下轉(zhuǎn)換與向上轉(zhuǎn)換相反。
在向上轉(zhuǎn)換中,賦值向上移動(dòng)類層次結(jié)構(gòu),而在向下轉(zhuǎn)換中,賦值向下移動(dòng)類層次結(jié)構(gòu)。
我們必須在向下轉(zhuǎn)換中使用類型轉(zhuǎn)換。
Manager mgr = (Manager)emp; // OK. Downcast at work
上面的代碼生成以下結(jié)果。
Java instanceof運(yùn)算符幫助我們確定引用變量是否有對(duì)類或子類的引用。
它需要兩個(gè)操作數(shù),并計(jì)算為布爾值true或false。
它的語法是
<Class Reference Variable> instanceof <Class Name or Interface>如果<Class Reference Variable>引用類<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 }
我們可以通過聲明類final來禁用子類。
最終的類不能被子類化。
下面的代碼聲明了一個(gè)名為MyClass的最終類:
public final class MyClass{ }
我們也可以聲明一個(gè)方法為final。最終方法不能被子類覆蓋或隱藏。
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)電話:173-0602-2364|舉報(bào)郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號(hào)
聯(lián)系方式:
更多建議: