国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

創建子類對象時,父類構造函數中調用被子類重寫的方法為什么調用的是子類的方法,而被子類重載的方法不會調

guyan0319 / 1361人閱讀

摘要:問題為什么創建對象的時候父類會調用子類方法但是創建對象父類會調用父類的方法答案當子類被加載到內存方法區后,會繼續加載父類到內存中。如果子類重載了父類方法,則子類重載方法引用還指向子類方法。

public class Basic{
    public void add(int i)
    {
        System.out.println("Basic add");
    }
    
    public Basic()
    {
        add("a");
    }
}

public class A extends Basic{
    public void add(int i)
    {
        System.out.println("A add");
    }
}

public class B extends Basic{
    public void add(char i)
    {
        System.out.println("B add");
    }
}

public class Main{
    public static void main(String[] args)
    {
        A a = new A();
        B b = new B();
    }
}

問題:為什么創建A對象的時候父類會調用子類方法?
但是:創建B對象父類會調用父類的方法?

答案:
當子類被加載到內存方法區后,會繼續加載父類到內存中。
如果,子類重寫了父類的方法,子類的方法引用會指向子類的方法,否則子類的方法引用會指向父類的方法引用。
如果子類重載了父類方法,則子類重載方法引用還指向子類方法。
如果子類方法沒有重寫也沒有重載父類方法,則方法引用會指向父類方法。

當子類對象創建時,會先行調用父類的構造方法(構造方法也是方法),虛擬機會在子類方法區尋找該方法并運行。
但是:由于java語言是靜態多分派,動態單分派。其結果是當編譯的時候,父類構造方法調用的方法的參數已經強制轉換為符合父類方法的參數了。
上邊代碼在編譯前已經轉換為下面這個樣子的了。

public class Basic{
    public void add(int i)
    {
        System.out.println("Basic add");
    }
    
    public Basic()
    {
        add((int)"a");
    }
}

public class A extends Basic{
    public void add(int i)
    {
        System.out.println("A add");
    }
}

public class B extends Basic{
    public void add(char i)
    {
        System.out.println("B add");
    }
}

public class Main{
    public static void main(String[] args)
    {
        A a = new A();
        B b = new B();
    }
}

看一下上邊的代碼,是不是恍然大悟?

更多文章:http://blog.gavinzh.com

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/64399.html

相關文章

  • java面向對象(上)

    摘要:根據出現的位置,作為對象的默認引用有兩種情形構造器中引用該構造器正在初始化的對象。在構造器中代表該構造器正在初始化的對象。用于限定該對象調用它從父類得到的實例變量和方法。 子類繼承父類就可以繼承到父類的成員變量和方法。如果訪問控制允許,子類實例可以直接調用父類里定義的方法。 如果多個重載的構造器里包含了相同的初始化代碼,則可以把這些初始化代碼放置在普通代碼塊里完成,初始化塊總在構...

    liaosilzu2007 評論0 收藏0
  • Java 面向對象(上)

    摘要:對象的引用關鍵字總是指向調用該方法的對象。根據出現位置的不同,作為對象的默認引用有兩種情形。構造器中引用該構造器正在初始化的對象。如果同一個類中包含了兩個或兩個以上方法的方法名相同,但形參列表不同,則被稱為方法重載。 類和對象 定義類 面向對象的程序設計過程中有兩個重要概念:類(class)和對象(object,也被稱為實例,instance),其中類是某一批對象的抽象,可以把類理解成...

    SimonMa 評論0 收藏0
  • Java類繼承

    摘要:的繼承具有單繼承的特點,每個子類只有一個直接父類。繼承的特點的繼承通過關鍵字來實現,實現繼承的類被稱為子類,被繼承的類被稱為父類,有的也稱其為基類超類。是提供的一個關鍵字,用于限定該對象調用它從父類繼承得到的實例變量或方法。 繼承是面向對象的三大特征之一,也是軟件復用的重要手段。Java的繼承具有單繼承的特點,每個子類只有一個直接父類。 繼承的特點 Java的繼承通過extends關鍵...

    seanHai 評論0 收藏0
  • 談談Java面向對象

    摘要:也就是說,一個實例變量,在的對象初始化過程中,最多可以被初始化次。當所有必要的類都已經裝載結束,開始執行方法體,并用創建對象。對子類成員數據按照它們聲明的順序初始化,執行子類構造函數的其余部分。 類的拷貝和構造 C++是默認具有拷貝語義的,對于沒有拷貝運算符和拷貝構造函數的類,可以直接進行二進制拷貝,但是Java并不天生支持深拷貝,它的拷貝只是拷貝在堆上的地址,不同的變量引用的是堆上的...

    ormsf 評論0 收藏0
  • Java 面向對象特性之多態性

    摘要:多態性面向對象三大特性封裝繼承多態。面向對象多態性存在的三個必要條件繼承重寫父類引用指向子類對象多態性的實現方式重寫與重載靜態多態性方法重載方法重載允許類具有多個相同名稱的方法,但是方法參數列表不同。 多態性 面向對象(OOP)三大特性:封裝、繼承、多態。 多態性(polymorphism)指同一行為具有多種不同表現形式,在面向對象程序設計中表現為同一消息可以根據發送對象的類型不同,做...

    _ang 評論0 收藏0

發表評論

0條評論

guyan0319

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<