2016-04-05 67 views
0

我的理解是,我們不能覆蓋的成員變量,但是當我運行下面的程序,我得到意想不到的O/P的成員變量方法重載

class Parent { 
    String message = "parent"; 
    void say() { 
     System.out.println(message); 
    } 
    } 

    class Child extends Parent { 
     String message = "child"; 
} 

public class Test { 
    public static void main(String[] args) { 
     new Child().say(); 
    } 
} 

在O/PI我得到「parent」雖然我們使用子對象調用say方法,甚至沒有父引用。

任何人都可以幫助我理解它。

謝謝

回答

1

「say」方法在父類上,而不在子類上。所以當它呼籲「消息」成員時,它會看到他自己的,而不是孩子的。這個電話是通過一個孩子班級進行的,這一事實無關緊要。 的確,成員變量在這裏沒有被覆蓋。這是預期的行爲。

編輯:

Java Language Specification說:「如果這個類聲明的字段具有特定名稱,那麼該字段的聲明說,隱藏在超具有相同名稱字段的任何和所有可訪問的聲明,和該類的超級接口。「

「繼承」並不意味着「複製」。當您在子實例上調用「say」方法時,不是調用方法的「代碼副本」,而是父類的方法,因爲它在父類中定義。父類對兒童變量成員一無所知。

+0

我同意「say」方法在父類中,但它也被繼承到子類中所以不應該打印子類成員變量。 – Manish

0

你的子類是擴展父類功能!所以子類默認說方法,並且它的值(父),因爲當你從子對象調用方法時會調用父類方法。如果您想要打印「child」,則需要在子類中覆蓋say方法,並更改從父類擴展的默認功能。

相關問題