摘要:問題為什么創建對象的時候父類會調用子類方法但是創建對象父類會調用父類的方法答案當子類被加載到內存方法區后,會繼續加載父類到內存中。如果子類重載了父類方法,則子類重載方法引用還指向子類方法。
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
摘要:根據出現的位置,作為對象的默認引用有兩種情形構造器中引用該構造器正在初始化的對象。在構造器中代表該構造器正在初始化的對象。用于限定該對象調用它從父類得到的實例變量和方法。 子類繼承父類就可以繼承到父類的成員變量和方法。如果訪問控制允許,子類實例可以直接調用父類里定義的方法。 如果多個重載的構造器里包含了相同的初始化代碼,則可以把這些初始化代碼放置在普通代碼塊里完成,初始化塊總在構...
摘要:對象的引用關鍵字總是指向調用該方法的對象。根據出現位置的不同,作為對象的默認引用有兩種情形。構造器中引用該構造器正在初始化的對象。如果同一個類中包含了兩個或兩個以上方法的方法名相同,但形參列表不同,則被稱為方法重載。 類和對象 定義類 面向對象的程序設計過程中有兩個重要概念:類(class)和對象(object,也被稱為實例,instance),其中類是某一批對象的抽象,可以把類理解成...
摘要:也就是說,一個實例變量,在的對象初始化過程中,最多可以被初始化次。當所有必要的類都已經裝載結束,開始執行方法體,并用創建對象。對子類成員數據按照它們聲明的順序初始化,執行子類構造函數的其余部分。 類的拷貝和構造 C++是默認具有拷貝語義的,對于沒有拷貝運算符和拷貝構造函數的類,可以直接進行二進制拷貝,但是Java并不天生支持深拷貝,它的拷貝只是拷貝在堆上的地址,不同的變量引用的是堆上的...
摘要:多態性面向對象三大特性封裝繼承多態。面向對象多態性存在的三個必要條件繼承重寫父類引用指向子類對象多態性的實現方式重寫與重載靜態多態性方法重載方法重載允許類具有多個相同名稱的方法,但是方法參數列表不同。 多態性 面向對象(OOP)三大特性:封裝、繼承、多態。 多態性(polymorphism)指同一行為具有多種不同表現形式,在面向對象程序設計中表現為同一消息可以根據發送對象的類型不同,做...
閱讀 798·2021-09-06 15:02
閱讀 2439·2019-08-30 15:43
閱讀 2164·2019-08-30 11:26
閱讀 2372·2019-08-26 12:12
閱讀 3538·2019-08-23 18:24
閱讀 3254·2019-08-23 18:16
閱讀 695·2019-08-23 17:02
閱讀 2241·2019-08-23 15:34