標籤:允許 div 訪問 實現 com 子類 getc shc ext
1>繼承條件下的構造方法調用
運行 TestInherits.java 樣本,觀察輸出,注意總結父類與子類之間構造方法的調用關係修改 Parent 構造方法的代碼,顯式調用 GrandParent 的另一個建構函式,注意這句調用代碼是否是第一句,影響重大
原始碼:
class Grandparent{ public Grandparent(){ System.out.println("GrandParent Created."); } public Grandparent(String string){ System.out.println("GandParean Created.string:"+string); }}class Parent extends Grandparent{ public Parent(){ //super("123456"); System.out.println("Parent Created."); //super("123456"); }}class Child extends Parent{ public Child(){ System.out.println("Child Created"); }}public class TestInherits { public static void main(String[] args) { // TODO Auto-generated method stub Child c = new Child(); }}
運行結果:
結果分析:
繼承關係中建構函式先調用基類的然後調用子類的,當顯式調用GrandParent的另一個建構函式時,但通過 super 調用基類構造方法時,必須是子類構造方法中的第一個語句,如果是第二個語句就會報錯。
思索:
為什麼子類的構造方法在運行之前,必須調用父類的構造方法?能不能反過來?為什麼不能反過來?
原因:
建構函式用來在建立對象時初始化對象,與new運算子一起使用在建立對象的語句時。子類擁有父類的成員變數和成員方法,如果不調用,則從父類繼承而來的成員變數和成員方法得不到正確的初始化。不可以反過來調用,父類不知道子類有什麼變數,導致子類得不到正確的初始化,程式出錯。
2>無任何成員變數的空類
參看 ExplorationJDKSource.java 樣本,此樣本中定義了一個類A,它沒有任何成員: class A { }
public class ExplorationJDKSource { /** * @param args */ public static void main(String[] args) { System.out.println(new A()); }}class A{}
實驗結果:
結果分析:
前面樣本中,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();
3>方法覆蓋
1)我們來看一段代碼(樣本Fruit.java ):
運行結果:
實驗分析:
Fruit類覆蓋了Object類的toString方法。在“+”運算中,當任何一個對象與一個String對象串連時,會隱式地調用其toString()方法,預設情況下,此方法返回“類名 @ + hashCode”。為了返回有意義的資訊,子類可以重寫toString()方法。
4>“方法覆蓋(override)”的要點
方法覆蓋要求子類與父類的方法一模一樣,否則就是方法重載(overload)
請自行編寫代碼測試以下特性(動手動腦): 在子類中,若要調用父類中被覆蓋的方法,可以使用super關鍵字。
class Parent{ public Parent() { System.out.println("這是父類方法"); }}class Son extends Parent{ public Son() { super(); System.out.println("這是子類方法"); }}public class OverLoad { public static void main(String[] args) { // TODO Auto-generated method stub Son son = new Son(); }}
運行結果:
實驗分析:
(1)覆蓋方法的允許存取範圍不能小於原方法。
(2)覆蓋方法所拋出的異常不能比原方法更多。
(3)聲明為final方法不允許覆蓋。 例如,Object的getClass()方法不能覆蓋。
(4)不能覆蓋靜態方法。
Java(介面與繼承)動手動腦