繁体   English   中英

继承中的静态变量

[英]static variables in inheritance

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

我的问题是Bi如何被称为Ai

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

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

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

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

请注意,如果在B定义另一个i ,它将影响 Ai ,从而难以访问后者。 我已经看到人们期望这种行为具有多态性 ,但事实并非如此(无论如何,你的情况略有不同,因为Aistatic )。

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

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

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

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

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列表。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM