Java 繼承

2018-01-18 19:16 更新

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

子類可以從超類繼承。超類也稱為基類或父類。子類也稱為派生類或子類。

從另一個(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ì)象父類

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

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

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

instanceof運(yùn)算符

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

掃描二維碼

下載編程獅App

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

編程獅公眾號(hào)