Java 繼承

2018-01-18 19:16 更新

Java面向?qū)ο笤O(shè)計(jì) - Java繼承

子類(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ǔ)法

一般的語(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)

對(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),它可以使用這些方法。

向上轉(zhuǎn)換和向下轉(zhuǎn)換

現(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é)果。

instanceof運(yùn)算符

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()  {
    }
}
以上內(nèi)容是否對(duì)您有幫助:
在線(xiàn)筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)