成人无码视频,亚洲精品久久久久av无码,午夜精品久久久久久毛片,亚洲 中文字幕 日韩 无码

資訊專欄INFORMATION COLUMN

Java? 教程(重寫和隱藏方法)

fox_soyoung / 726人閱讀

重寫和隱藏方法 實(shí)例方法

子類中的實(shí)例方法的簽名(名稱,加上其參數(shù)的數(shù)量和類型)和返回類型與超類中的實(shí)例方法相同,將覆蓋超類的方法。

子類覆蓋方法的能力允許類從行為“足夠接近”的超類繼承,然后根據(jù)需要修改行為,重寫方法與它重寫的方法具有相同的名稱、數(shù)量和參數(shù)類型,以及返回類型。重寫方法還可以返回由被重寫方法返回的類型的子類型,此子類型稱為協(xié)變返回類型。

覆蓋方法時(shí),你可能希望使用@Override注解來(lái)指示編譯器你要覆蓋超類中的方法,如果由于某種原因,編譯器檢測(cè)到該方法在其中一個(gè)超類中不存在,那么它將生成錯(cuò)誤,有關(guān)@Override的更多信息,請(qǐng)參閱注解。

靜態(tài)方法

如果子類定義的靜態(tài)方法與超類中的靜態(tài)方法具有相同的簽名,則子類中的方法會(huì)隱藏超類中的方法。

隱藏靜態(tài)方法和覆蓋實(shí)例方法之間的區(qū)別具有重要意義:

被調(diào)用的重寫的實(shí)例方法的版本是子類中的版本。

被調(diào)用的隱藏靜態(tài)方法的版本取決于它是從超類還是從子類調(diào)用的。

考慮一個(gè)包含兩個(gè)類的示例,第一個(gè)是Animal,它包含一個(gè)實(shí)例方法和一個(gè)靜態(tài)方法:

public class Animal {
    public static void testClassMethod() {
        System.out.println("The static method in Animal");
    }
    public void testInstanceMethod() {
        System.out.println("The instance method in Animal");
    }
}

第二個(gè)類是Animal的一個(gè)子類,叫做Cat

public class Cat extends Animal {
    public static void testClassMethod() {
        System.out.println("The static method in Cat");
    }
    public void testInstanceMethod() {
        System.out.println("The instance method in Cat");
    }

    public static void main(String[] args) {
        Cat myCat = new Cat();
        Animal myAnimal = myCat;
        Animal.testClassMethod();
        myAnimal.testInstanceMethod();
    }
}

Cat類重寫Animal中的實(shí)例方法,并隱藏Animal中的靜態(tài)方法,此類中的main方法創(chuàng)建Cat的實(shí)例,并在類上調(diào)用testClassMethod()并在實(shí)例上調(diào)用testInstanceMethod()。

該程序的輸出如下:

The static method in Animal
The instance method in Cat

正如所承諾的那樣,被調(diào)用的隱藏靜態(tài)方法的版本是超類中的版本,被調(diào)用的重寫實(shí)例方法的版本是子類中的版本。

接口方法

接口中的默認(rèn)方法和抽象方法與實(shí)例方法一樣是繼承的,但是,當(dāng)類或接口的超類型提供具有相同簽名的多個(gè)默認(rèn)方法時(shí),Java編譯器遵循繼承規(guī)則來(lái)解決名稱沖突,這些規(guī)則由以下兩個(gè)原則驅(qū)動(dòng):

實(shí)例方法優(yōu)先于接口默認(rèn)方法。

考慮以下類和接口:

public class Horse {
    public String identifyMyself() {
        return "I am a horse.";
    }
}
public interface Flyer {
    default public String identifyMyself() {
        return "I am able to fly.";
    }
}
public interface Mythical {
    default public String identifyMyself() {
        return "I am a mythical creature.";
    }
}
public class Pegasus extends Horse implements Flyer, Mythical {
    public static void main(String... args) {
        Pegasus myApp = new Pegasus();
        System.out.println(myApp.identifyMyself());
    }
}

方法Pegasus.identifyMyself返回字符串I am a horse。

已經(jīng)被其他候選者覆蓋的方法將被忽略,當(dāng)超類型共享一個(gè)共同的祖先時(shí),就會(huì)出現(xiàn)這種情況。

考慮以下接口和類:

public interface Animal {
    default public String identifyMyself() {
        return "I am an animal.";
    }
}
public interface EggLayer extends Animal {
    default public String identifyMyself() {
        return "I am able to lay eggs.";
    }
}
public interface FireBreather extends Animal { }
public class Dragon implements EggLayer, FireBreather {
    public static void main (String... args) {
        Dragon myApp = new Dragon();
        System.out.println(myApp.identifyMyself());
    }
}

方法Dragon.identifyMyself返回字符串I am able to lay eggs。

如果兩個(gè)或多個(gè)獨(dú)立定義的默認(rèn)方法沖突,或者默認(rèn)方法與抽象方法沖突,則Java編譯器會(huì)產(chǎn)生編譯器錯(cuò)誤,你必須顯式覆蓋超類型方法。

考慮一下現(xiàn)在可以飛行的計(jì)算機(jī)控制汽車的例子,你有兩個(gè)接口(OperateCarFlyCar)為同一方法提供默認(rèn)實(shí)現(xiàn)(startEngine):

public interface OperateCar {
    // ...
    default public int startEngine(EncryptedKey key) {
        // Implementation
    }
}
public interface FlyCar {
    // ...
    default public int startEngine(EncryptedKey key) {
        // Implementation
    }
}

實(shí)現(xiàn)OperateCarFlyCar的類必須覆蓋方法startEngine,你可以使用super關(guān)鍵字調(diào)用任何默認(rèn)實(shí)現(xiàn)。

public class FlyingCar implements OperateCar, FlyCar {
    // ...
    public int startEngine(EncryptedKey key) {
        FlyCar.super.startEngine(key);
        OperateCar.super.startEngine(key);
    }
}

super之前的名稱(在此示例中為FlyCarOperateCar)必須引用定義或繼承默認(rèn)調(diào)用方法的直接超接口,這種形式的方法調(diào)用不限于區(qū)分包含具有相同簽名的默認(rèn)方法的多個(gè)已實(shí)現(xiàn)接口,你可以使用super關(guān)鍵字在類和接口中調(diào)用默認(rèn)方法。

類中的繼承實(shí)例方法可以覆蓋抽象接口方法,考慮以下接口和類:

public interface Mammal {
    String identifyMyself();
}
public class Horse {
    public String identifyMyself() {
        return "I am a horse.";
    }
}
public class Mustang extends Horse implements Mammal {
    public static void main(String... args) {
        Mustang myApp = new Mustang();
        System.out.println(myApp.identifyMyself());
    }
}

方法Mustang.identifyMyself返回字符串I am a horse,Mustang類繼承了Horse類中的方法identifyMyself,它覆蓋了Mammal接口中同名的抽象方法。

注意:接口中的靜態(tài)方法永遠(yuǎn)不會(huì)被繼承。
修飾符

重寫方法的修飾符可以允許比被重寫方法更多但不是更少的訪問(wèn),例如,超類中的protected實(shí)例方法可以在子類中是public,但不能是private。

如果嘗試將超類中的實(shí)例方法更改為子類中的靜態(tài)方法,則會(huì)出現(xiàn)編譯時(shí)錯(cuò)誤,反之亦然。

總結(jié)

下表總結(jié)了在定義具有與超類中的方法相同的簽名的方法時(shí)發(fā)生的情況。

超類實(shí)例方法 超類靜態(tài)方法
子類實(shí)例方法 覆蓋 生成編譯時(shí)錯(cuò)誤
子類靜態(tài)方法 生成編譯時(shí)錯(cuò)誤 隱藏
注意:在子類中,你可以重載從超類繼承的方法,這樣的重載方法既不隱藏也不覆蓋超類實(shí)例方法 — 它們是新方法,對(duì)于子類是唯一的。
上一篇:繼承 下一篇:多態(tài)性

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/72877.html

相關(guān)文章

  • Java? 教程(繼承)

    繼承 在前面的課程中,你已經(jīng)多次看到了繼承,在Java語(yǔ)言中,類可以從其他類派生,從而從這些類繼承字段和方法。 定義:從另一個(gè)類派生的類稱為子類(也是派生類,擴(kuò)展類或子類),派生子類的類稱為超類(也是基類或父類)。 除了Object沒(méi)有超類,每個(gè)類都有一個(gè)且只有一個(gè)直接超類(單繼承),在沒(méi)有任何其他顯式超類的情況下,每個(gè)類都隱式地是Object的子類。 類可以從派生自類的類派生的類派生,依此類推,...

    Achilles 評(píng)論0 收藏0
  • Java? 教程(使用super關(guān)鍵字)

    使用super關(guān)鍵字 訪問(wèn)超類成員 如果你的方法覆蓋了它的一個(gè)超類的方法,你可以通過(guò)使用關(guān)鍵字super來(lái)調(diào)用被重寫的方法,你也可以使用super來(lái)引用隱藏字段(盡管不鼓勵(lì)隱藏字段),慮這個(gè)類,Superclass: public class Superclass { public void printMethod() { System.out.println(Print...

    CKJOKER 評(píng)論0 收藏0
  • Java? 教程(多態(tài)性)

    多態(tài)性 多態(tài)性的字典定義是指生物學(xué)中的原理,其中生物體或物種可以具有許多不同的形式或階段,這個(gè)原則也可以應(yīng)用于面向?qū)ο蟮木幊毯拖馢ava語(yǔ)言之類的語(yǔ)言,類的子類可以定義它們自己的唯一行為,但仍然共享父類的一些相同功能。 可以通過(guò)對(duì)Bicycle類的微小修改來(lái)演示多態(tài)性,例如,可以將printDescription方法添加到顯示當(dāng)前存儲(chǔ)在實(shí)例中的所有數(shù)據(jù)的類中。 public void printD...

    J4ck_Chan 評(píng)論0 收藏0
  • Java? 教程(目錄)

    Java? 教程 Java教程是為JDK 8編寫的,本頁(yè)面中描述的示例和實(shí)踐沒(méi)有利用在后續(xù)版本中引入的改進(jìn)。 Java教程是希望使用Java編程語(yǔ)言創(chuàng)建應(yīng)用程序的程序員的實(shí)用指南,其中包括數(shù)百個(gè)完整的工作示例和數(shù)十個(gè)課程,相關(guān)課程組被組織成教程。 覆蓋基礎(chǔ)知識(shí)的路徑 這些教程以書籍的形式提供,如Java教程,第六版,前往Amazon.com購(gòu)買。 入門 介紹Java技術(shù)和安裝Java開發(fā)軟件并使用...

    lifesimple 評(píng)論0 收藏0
  • 第3章:抽象數(shù)據(jù)類型(ADT)面向?qū)ο缶幊蹋∣OP) 3.4面向?qū)ο缶幊蹋∣OP)

    摘要:抽象數(shù)據(jù)類型的多個(gè)不同表示可以共存于同一個(gè)程序中,作為實(shí)現(xiàn)接口的不同類。封裝和信息隱藏信息隱藏將精心設(shè)計(jì)的模塊與不好的模塊區(qū)分開來(lái)的唯一最重要的因素是其隱藏內(nèi)部數(shù)據(jù)和其他模塊的其他實(shí)施細(xì)節(jié)的程度。 大綱 面向?qū)ο蟮臉?biāo)準(zhǔn)基本概念:對(duì)象,類,屬性,方法和接口OOP的獨(dú)特功能 封裝和信息隱藏 繼承和重寫 多態(tài)性,子類型和重載 靜態(tài)與動(dòng)態(tài)分派 Java中一些重要的Object方法設(shè)計(jì)好的類面向...

    Heier 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

閱讀需要支付1元查看
<