亚洲区国产区激情区无码区,国产成人mv视频在线观看,国产A毛片AAAAAA,亚洲精品国产首次亮相在线

Java 菜鳥(niǎo)教程

Java 流程控制

Java 數(shù)組

Java 面向?qū)ο?I)

Java 面向?qū)ο?II)

Java 面向?qū)ο?III)

Java 異常處理

Java 列表(List)

Java Queue(隊(duì)列)

Java Map集合

Java Set集合

Java 輸入輸出(I/O)

Java Reader/Writer

Java 其他主題

Java 方法重寫(xiě)

在本教程中,我們將借助示例來(lái)學(xué)習(xí)Java中的方法重寫(xiě)。

在上一教程中,我們了解了繼承。繼承是一個(gè)OOP屬性,它使我們可以從現(xiàn)有的類(lèi)(父類(lèi))派生一個(gè)新的類(lèi)(子類(lèi)),而子類(lèi)繼承超類(lèi)的屬性和方法。

現(xiàn)在,如果在父類(lèi)和子類(lèi)中都定義了相同的方法,則子類(lèi)的方法將覆蓋超類(lèi)的方法。這稱(chēng)為方法覆蓋(方法重寫(xiě))。

示例1:方法覆蓋

class Animal {
   public void displayInfo() {
      System.out.println("I am an animal.");
   }
}

class Dog extends Animal {
   @Override
   public void displayInfo() {
      System.out.println("I am a dog.");
   }
}

class Main {
   public static void main(String[] args) {
      Dog d1 = new Dog();
      d1.displayInfo();
   }
}

輸出

I am a dog.

在以上程序中,displayInfo()方法同時(shí)存在于Animal父類(lèi)和Dog子類(lèi)中。

當(dāng)我們使用d1對(duì)象(子類(lèi)的對(duì)象)調(diào)用displayInfo()時(shí),會(huì)調(diào)用子類(lèi)Dog中的方法。子類(lèi)的displayInfo()方法覆蓋父類(lèi)的相同方法。

Java中方法重寫(xiě)的工作。

注意在我們的示例中使用了@Override注釋。在Java中,注釋是我們用來(lái)向編譯器提供信息的元數(shù)據(jù)。這里,@Override注釋告訴編譯器,該注釋之后的方法將覆蓋超類(lèi)的方法。

使用@Override不是強(qiáng)制性的。但是,當(dāng)我們使用這個(gè)方法時(shí),該方法應(yīng)該遵循覆蓋的所有規(guī)則。否則,編譯器將生成錯(cuò)誤。

Java 重寫(xiě)規(guī)則

  • 父類(lèi)和子類(lèi)都必須具有相同的方法名稱(chēng),相同的返回類(lèi)型和相同的參數(shù)列表。

  • 我們不能重寫(xiě)聲明為final和static的方法。

  • 我們應(yīng)該始終重寫(xiě)超類(lèi)的抽象方法(將在以后的教程中進(jìn)行討論)。

Java 重寫(xiě)中的super關(guān)鍵字

在Java中執(zhí)行重寫(xiě)時(shí)出現(xiàn)的一個(gè)常見(jiàn)問(wèn)題是:

 我們可以在重寫(xiě)后訪問(wèn)超類(lèi)的方法嗎?

答案是肯定的。要從子類(lèi)訪問(wèn)超類(lèi)的方法,我們使用super關(guān)鍵字。

示例2:使用super關(guān)鍵字

class Animal {
   public void displayInfo() {
      System.out.println("I am an animal.");
   }
}

class Dog extends Animal {
   public void displayInfo() {
      super.displayInfo();
      System.out.println("I am a dog.");
   }
}

class Main {
   public static void main(String[] args) {
      Dog d1 = new Dog();
      d1.displayInfo();
   }
}

輸出

I am an animal.
I am a dog.

在上面的實(shí)例中,子類(lèi)Dog覆蓋了超類(lèi)Animal的displayInfo()方法。

當(dāng)我們使用Dog子類(lèi)的d1對(duì)象調(diào)用displayInfo()方法時(shí),將調(diào)用Dog子類(lèi)內(nèi)部的方法。 不會(huì)調(diào)用父類(lèi)內(nèi)部的方法。

在Dog子類(lèi)的displayInfo()內(nèi)部,我們使用了super.displayInfo()來(lái)調(diào)用父類(lèi)的displayInfo()。

需要注意的是,Java中的構(gòu)造函數(shù)不會(huì)被繼承。因此,在Java中不存在諸如構(gòu)造函數(shù)重寫(xiě)之類(lèi)的問(wèn)題。

但是,我們可以從其子類(lèi)中調(diào)用超類(lèi)的構(gòu)造函數(shù)。為此,我們使用super()。要了解更多信息,請(qǐng)?jiān)L問(wèn)Java super關(guān)鍵字。

方法重寫(xiě)中的訪問(wèn)說(shuō)明符

在父類(lèi)及其子類(lèi)中聲明的相同方法可以具有不同的訪問(wèn)說(shuō)明符。但是,有一個(gè)限制。

我們只能,在提供比父類(lèi)的訪問(wèn)說(shuō)明符更大的訪問(wèn)權(quán)限的子類(lèi)中使用的那些訪問(wèn)說(shuō)明符。 例如,

假設(shè)父類(lèi)中的方法myClass()被聲明為protected。然后,myClass()子類(lèi)中的相同方法可以是 public 或 protected,但不能是private。

示例3:重寫(xiě)中的訪問(wèn)說(shuō)明符

class Animal {
   protected void displayInfo() {
      System.out.println("I am an animal.");
   }
}

class Dog extends Animal {
   public void displayInfo() {
      System.out.println("I am a dog.");
   }
}

class Main {
   public static void main(String[] args) {
      Dog d1 = new Dog();
      d1.displayInfo();
   }
}

輸出

I am a dog.

在上面的示例中,子類(lèi)Dog重寫(xiě)了父類(lèi)Animal的displayInfo()方法。

每當(dāng)我們使用d1(子類(lèi)的對(duì)象)調(diào)用displayInfo()時(shí),就會(huì)調(diào)用子類(lèi)內(nèi)部的方法。

注意,displayInfo()在Animal父類(lèi)中聲明為受保護(hù)的(protected)。該方法在Dog子類(lèi)中具有公共訪問(wèn)說(shuō)明符(public)。這是允許的,因?yàn)閜ublic提供了比protected更大的訪問(wèn)權(quán)限。

重寫(xiě)抽象方法

在Java中,抽象類(lèi)被創(chuàng)建為其他類(lèi)的父類(lèi)(基類(lèi))。而且,如果類(lèi)包含抽象方法,則必須重寫(xiě)它。

在后面的教程中,我們將學(xué)習(xí)有關(guān)抽象類(lèi)和抽象方法的重寫(xiě)的更多信息。