2010-06-16 97 views
12

我只是刷新了Java的功能哎呀。所以,我對繼承概念有點困惑。對於我有以下示例代碼:理解繼承的概念在Java中

class Super{ 
    int index = 5; 
    public void printVal(){ 
     System.out.println("Super"); 
    } 
} 
class Sub extends Super{ 
    int index = 2; 
    public void printVal(){ 
     System.out.println("Sub"); 
    } 
} 
public class Runner { 
    public static void main(String args[]){ 
     Super sup = new Sub(); 
     System.out.println(sup.index+","); 
     sup.printVal(); 
    } 
} 

現在上面的代碼是給我輸出爲:5,子。

在這裏,我們覆蓋printVal()方法,所以這是可以理解的,它只是訪問子類的方法。

但我不明白爲什麼它從超類訪問x的值...

在此先感謝....

+0

請評論哪個答案是最接近的是正確的。 – harshalb 2010-06-16 10:41:02

回答

8

對象具有類型和變量有類型。因爲你把:

Super sup = new Sub(); 

現在你有Super型是指Sub類型對象的變量sup

當您在對象上調用方法時,將根據對象的類型選擇運行的方法,這就是爲什麼它會打印「Sub」而不是「Super」的原因。

當在對象訪問一個字段,該字段是基於所述可變的類型,這就是爲什麼你選擇5.

11

這就是所謂實例變量隱藏 - link。基本上,你有兩個獨立的變量,由於基準的類型是Super它將使用index變量從Super

+1

該死的,正要寫下同樣的一句話:-)。 – helpermethod 2010-06-16 10:12:56

2

指數僅僅是屬於父類的場。因爲它屬於父類,這意味着它是所有孩子的屬性。 要簡單的概念:

A類動物可能有場年齡和場 所有子類將共享這些屬性,但必須附加字段(S),這將被包含到那些僅兒童班。例如染髮可能是狗類的唯一屬性,而不是類的蛇,這可能有一個簡單的獨特屬性有毒

在這種結構中的所有動物都有一個名字,年齡,這是一般可以定義動物的東西,每種物種都有一些特殊的屬性,它們被包含在它們各自的子類中。

您的代碼不會清楚地表明這一點,因爲你的子類沒有構造函數,確實沒有超級構造函數調用。正如Petar所解釋的那樣,您的私人屬性索引是來自超級類別的訪問

2

發生這種情況因爲函數遵循運行時綁定,而變量在編譯時被綁定。

所以變量取決於引用的數據類型,而函數取決於引用的數據類型所表示的值。

+2

你可以exaplain在java中的指針在哪裏 – harshalb 2010-06-16 10:38:43

0

當我們將子類的對象分配給父類對象時,只有父類對象可以接受通用屬性這兩個類,因此被稱爲對象分割 這就是爲什麼專利類5的值被打印出來的唯一原因財產不是方法