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

我的问题是如何B.i指代A.i

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

4

4 回答 4

1

的公共或受保护成员A在 的所有子类中可见A

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

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

请注意,如果您在 中定义另一个iB它将遮蔽 A.i,从而难以访问后者。我见过人们期望这表现出 polymorphically,但事实并非如此(无论如何,您的情况略有不同,因为A.iis static)。

于 2013-04-10T09:44:53.980 回答
1

我这里是一个静态变量。一个静态变量,用外行的话来说,意味着所有类都可以访问一个副本。所以,由于你的 B 类扩展了 A,B 可以访问 A 的静态变量。

如果你在本地定义变量,那么变量的本地值隐藏了父类的值。

于 2013-04-10T10:04:11.627 回答
0

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

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

于 2013-04-10T09:46:04.510 回答
0

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

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

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

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

  • 对扩展类使用不同的静态常数。

这样做的一个用途是根据与使用 instanceof 相对的 STATIC 整数来识别类。这可以进一步结合一个开关来改变基于对象类型的行为。

因此,在最基本的示例中,假设我们要创建一个表示 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

您将看到代表不同节点类型的静态整数列表。

于 2013-04-10T09:46:34.793 回答