2013-04-10 112 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的静态变量。

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