標籤:另一個 valueof 樣本 第一個 sys 手動 blog ret turn
Java 課後作業
一.運行 TestInherits.java 樣本,觀察輸出,注意總結父類與子類之間構造方法的調用關係修改Parent構造方法的代碼,顯式調用GrandParent的另一個建構函式,注意這句調用代碼是否是第一句,影響重大!
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");
}
}
public class TestInherits {
public static void main(String args[]) {
Child c = new Child();
}
}
2.實驗結果:
3.結論:通過 super 調用基類構造方法,必須是子類構造方法中的第一個語句。
4.思索:為什麼子類的構造方法在運行之前,必須調用父類的構造方法?能不能反過來?為什麼不能反過來?
原因:建構函式用來在建立對象時初始化對象,與new運算子一起使用在建立對象的語句時。子類擁有父類的成員變數和成員方法,如果不調用,則從父類繼承而來的成員變數和成員方法得不到正確的初始化。不可以反過來調用,父類不知道子類有什麼變數,導致子類得不到正確的初始化,程式出錯。
二.無任何成員變數的空類
參看 ExplorationJDKSource.java 樣本,此樣本中定義了一個類A,它沒有任何成員: class A { }
1.原始碼:
public class ExplorationJDKSource {
public static void main(String[] args) {
System.out.println(new A());
}
}
class A{}
2.結果:
3.結果分析:
前面樣本中,main方法實際上調用的是: public void println(Object x),這一方法內部調用了String類的valueOf方法。 valueOf方法內部又調用Object.toString方法: public String toString()
{ return getClass().getName() +"@" + Integer.toHexString(hashCode()); }
hashCode方法是本地方法,由JVM設計者實現: public native int hashCode();
Java 7 動手動腦