1.首先,第一次執行完源**後
了解到當呼叫乙個子類的構造方法時,它會依次呼叫父類的建構函式。以下是原因:當乙個類繼承了其它類時,在它的建構函式(constructor)中super()
必須被首先呼叫,如果super()
沒有被呼叫,則編譯器將在建構函式(constructor)的第一行插入對super()
的呼叫。這就是為什麼當建立乙個子類的物件時會呼叫父類的建構函式(constructor)的原因。
通過super呼叫基類構造方法時,必須是子類構造方法中的第乙個語句。否則就會報錯
構造乙個物件,先呼叫其構造方法,來初始化其成員函式和成員變數。
子類擁有父的成員變數和成員方法,如果不呼叫,則從父類繼承而來的成員變數和成員方法得不到正確的初始化。
不能反過來呼叫也是這個原因,因為父類根本不知道子類有什麼變數而且這樣一來子類也得不到初始化的父類變數,導致程式執行出錯!
2.**:
1/*2信1705-1 楊瑞 201736103*/
子類物件可以直接賦給基類變數。
基類物件要賦給子類物件變數,必須執行型別轉換。
第乙個建立乙個parent物件,呼叫的是父類的方法,第二個建立乙個child物件,呼叫的是子類的方法,第三個將子類child的值賦給了parent,呼叫的是子類的方法,第四個parent.myvalue++是對父類中的變數進行自加運算,而parent.printvalue()實際上呼叫的還是子類的方法,第五個((child)parent).myvalue++是將parent物件強制轉化成child,所以指向的是child類中的變數,進行自加運算之後輸出。
當子類和父類擁有同樣的方法,物件是子型別的,就呼叫子型別的方法;物件是父型別的,就呼叫夫型別的方法。
如果子類與父類有相同的字段,則子類中的字段會代替或隱藏父類的字段,子類方法中訪問的是子類中的字段(而不是父類中的字段)。如果子類方法確實想訪問父類中被隱藏的同名字段,可以用super關鍵字來訪問它。
多型依賴於型別和實現的分離,多用來把介面和實現分離。
使用多型最大的好處是:
當要修改程式並擴充系統時,需要修改的地方較少,對其它部分**的影響較小!千萬不要小看這兩個「較」字,程式規模越大,其優勢就越突出。
動手又動腦 繼承與多型
1.為什麼子類的構造方法在執行之前,必須呼叫父類的構造方法?能不能反過來?為什麼不能反過來?因為構造方法是用來初始化類的成員屬性的,由於子類繼承父類,擁有父類的成員屬性,要對這些屬性賦值,就要通過父類的構造方法。因此不能反過來。2.何為多型?物件導向的程式語言中,多型大致分為靜態多型和動態多型。靜態...
動手動腦(繼承與多型)
1.為什麼子類的構造方法在執行之前,必須呼叫父類的構造方法?能不能反過來?為什麼不能反過來?構造方法主要用來建立物件時初始化物件,即為物件變數賦初始值。建立乙個物件,先呼叫構造方法來進行初始化,子類擁有父類的成員變數和方法,如果不調父類的構造方法,則從父類繼承而來的成員變數和方法得不到正確的初始化。...
繼承與多型 動手動腦
1.和測試結果如下 2.我的猜想 parent.printvalue myvalue 100 child.printvalue myvalue 200 parent.printvalue myvalue 101 child.printvalue myvalue 200 child.printvalu...