继承中的静态变量

时间:2013-04-10 09:40:31

标签: java inheritance static

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
    }
}

我的问题是如何将B.i引用到A.i

如果继承静态变量i,为什么java允许在B类中定义另一个变量i

4 个答案:

答案 0 :(得分:1)

A的所有子类中都显示A的公共成员或受保护成员。

  

如果静态变量i被继承,为什么java允许在B类中定义另一个变量i?

很难推测为什么。一个可能的原因是,这允许人们将成员添加到基类,而不会破坏任何已经碰巧具有相同名称的成员的派生类。

请注意,如果您在i中定义另一个B,它将 shadow A.i,从而难以访问后者。 I've seen people expecting this to behave polymorphically,但它没有(无论如何,您的情况略有不同,因为A.istatic)。

答案 1 :(得分:1)

我这里是一个静态变量。一个静态变量,在外行术语中,意味着所有类都可以访问一个副本。因此,由于你的B类扩展了A,B可以访问A的静态变量。

如果在本地定义变量,则变量的本地值会隐藏父类值。

答案 2 :(得分:0)

有两种不同的东西,范围和可见性。您不能在同一范围内重新定义变量两次(尽管您可以在嵌套范围中重新定义它们)。

但是在继承的情况下,子类超出了超类的范围,但由于继承而具有该变量的可见性。所以子类允许你再次定义变量i,虽然它会隐藏超类的变量。你不会看到它的价值。 (除非使用任何来自超类的getter)

答案 3 :(得分:0)

Java允许您更改扩展类的特定变量值。

这是因为静态变量在相同类的所有对象之间共享。 它是属于类的变量,而不是对象(实例)。

因此,当扩展父类的静态变量实际上不是扩展类的一部分时,BUT是可访问的(只要它们不是私有的)。

此外,这可用于执行以下操作:

  • 为扩展类使用不同的STATIC CONSTANT。

用于此目的的是基于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 Abstract Syntax Trees:

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

您将看到代表不同节点类型的STATIC INTEGERS列表。