動手動腦04
阿新 • • 發佈:2018-11-07
1
class Grandparent { public Grandparent() { System.out.println("GrandParent Created."); } public Grandparent(String string) { System.out.println("GrandParent Created.String:" + string); } } class Parent extends Grandparent {public Parent() { //super("Hello.Grandparent."); System.out.println("Parent Created"); // super("Hello.Grandparent."); } } class Child extends Parent { public Child() { System.out.println("Child Created"); } } publicclass TestInherits { public static void main(String args[]) { Child c = new Child(); } }
super呼叫基類構造方法,必須子類構造方法第一句。在下一級出來之後{super("Hello.Grandparent")}然後直接將這個傳到上一級裡面。
2.為什麼子類的構造方法在執行之前,必須呼叫父類的構造方法?能不能反過來?為什麼不能反過來?
建構函式主要是用來在建立物件時初始化物件,即為物件成員變數賦初值。由於子類是繼承父類的,所以建立子類物件時,必須先呼叫父類的構造方法,這樣子類才能有父類的屬性和方法。不能反過來是因為父類不知道子類有什麼變數,而子類也得不到父類的初始化變數。
3.在編譯原始碼時,當遇到沒有父類的類時,編譯器會定義的預設的父類(一般為Object),public void println(Object x),這一方法內部呼叫了String類的valueOf方法。valueOf方法內部又呼叫Object.toString方法:
public String toString() {
return getClass().getName() +"@" +
Integer.toHexString(hashCode());
}
4.方法覆蓋分別方法是根據宣告類屬於哪一個例如:
A a=new A();
B b=new B();
a.shu();
b.shu();
5.
如果子類與父類有相同的欄位,則子類中的欄位會代替或隱藏父類的欄位,子類方法中訪問的是子類中的欄位(而不是父類中的欄位)。如果子類方法確實想訪問父類中被隱藏的同名欄位,可以用super關鍵字來訪問它。如果子類被當作父類使用,則通過子類訪問的欄位是父類的。
當子類與父類擁有一樣的方法,並且讓一個父類變數引用一個子類物件時,物件是子型別的,它就呼叫子型別的方法,是父型別的,它就呼叫父型別的方法。