2013-04-10 115 views
0
public class A 
{ 
    public static int i; 
} 
public class B extends A 
{ 
    public static void main(String[] args) 
    { 
     System.out.println("print i=" + B.i); // referred to A.i 
    } 
} 

我在這裏的問題是如何參照A.i靜態變量繼承

如果靜態變量i被繼承,爲什麼java允許在B類中定義另一個變量i呢?

回答

1

A的公共或受保護成員在A的所有子類中都可見。

如果靜態變量i是繼承的,爲什麼java允許在B類中定義另一個變量i呢?

很難推測爲爲什麼。一個可能的原因是,這允許將成員添加到基類,而不會破壞任何已經碰巧具有相同名稱的成員的派生類。

需要注意的是,如果你在B定義另一個i,它將陰影A.i,因此很難進入後者。 I've seen people expecting this to behave polymorphically,但它不(你的情況無論如何都有些許不同,因爲A.istatic)。

+0

有趣的引言「很難猜測爲什麼。一個可能的原因是,這允許將成員添加到基類而不破壞已經碰巧具有相同名稱的成員的派生類。」 。這是我沒有考慮過的事情。 – 2013-04-10 10:38:46

0

有2個不同的東西,範圍和知名度。你不能在同一個作用域內重新定義一個變量兩次(儘管你可以在嵌套作用域中重新定義它們)。

但是在繼承的情況下,子類超出了超類的範圍,但由於繼承而具有該變量的可見性。所以子類允許你再次定義變量i,雖然它會隱藏超類的變量。你將無法看到它的價值。 (除非使用超類的任何獲取器)

0

Java允許您更改擴展類的特定變量值。

這是因爲靜態變量在相同類的所有對象之間共享。 它是屬於類而不是對象(實例)的變量。

因此,擴展父類的靜態變量實際上並不是擴展類的一部分,但可以訪問(只要它們不是私有的)。

此外,這可以被用來做的事情,例如:

  • 使用不同的靜態常量爲擴展的類。

用於此目的是爲了識別基於STATIC整數的類,以便利用instanceof。這可以與開關進一步結合,以基於對象類型來改變行爲。

因此,在最基本的例子中,想象一下我們想創建一個代表TYPE的變量。

class A 
{ 
    public static final int NODE_TYPE = NODE_PERSON; 
    public static final int NODE_PERSON = 0; 
    public static final int NODE_CAR = 1; 

} 

class B extends Class A 
{ 
    public static int NODE_TYPE = NODE_CAR; 
} 

這已經在很多框架,包括Eclipse抽象語法樹被用於:

http://help.eclipse.org/indigo/index.jsp?topic=%2Forg.eclipse.jdt.doc.isv%2Freference%2Fapi%2Forg%2Feclipse%2Fjdt%2Fcore%2Fdom%2FASTNode.html

你會看到代表不同的節點類型的靜態整數列表。

1

我在這裏是一個靜態變量。從外行的角度來說,靜態變量意味着所有類都可以訪問單個副本。因此,由於您的類B擴展了A,因此B有權訪問A的靜態變量。

如果您在本地定義變量,則變量的本地值會隱藏父類的值。