Java(介面與繼承)動手動腦

來源:互聯網
上載者:User

標籤:允許   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(介面與繼承)動手動腦

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.