Java 继承中的静态变量

Java 继承中的静态变量,java,inheritance,static,Java,Inheritance,Static,我这里的问题是如何将B.i称为A.i 如果继承了静态变量i,为什么java还允许在B类中定义另一个变量i?在A的所有子类中都可以看到A的公共或受保护成员 如果静态变量i被继承,为什么java也允许在B类中定义另一个变量i 很难猜测原因。一个可能的原因是,这允许向基类添加成员,而不破坏任何已经具有相同名称的成员的派生类 请注意,如果您在B中定义另一个i,它将对A.i进行阴影处理,从而使后者难以访问,但事实并非如此(无论如何,您的案例略有不同,因为A.i是static)。不能在同一范围内重新定义变量

我这里的问题是如何将
B.i
称为
A.i


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

A
的所有子类中都可以看到
A
的公共或受保护成员

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

很难猜测原因。一个可能的原因是,这允许向基类添加成员,而不破坏任何已经具有相同名称的成员的派生类


请注意,如果您在
B
中定义另一个
i
,它将对
A.i
进行阴影处理,从而使后者难以访问,但事实并非如此(无论如何,您的案例略有不同,因为
A.i
static
)。不能在同一范围内重新定义变量两次(尽管可以在嵌套范围内重新定义它们)


但在继承的情况下,子类不在超类的范围内,但由于继承,它仍然可以看到该变量。所以子类允许您再次定义变量
i
,尽管它会隐藏超类的变量。你将看不到它的价值。(除非使用超类的任何getter)

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

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

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

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

  • 对扩展类使用不同的静态常量
这种方法的一个用途是基于一个静态整数来识别类,与使用instanceof类似。这可以进一步与开关结合,以根据对象类型更改行为

因此,在最基本的示例中,假设我们想要创建一个变量表示类型

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
    }
}
这已在许多框架中使用,包括Eclipse抽象语法树:


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

i这里是一个静态变量。用外行术语来说,静态变量意味着所有类都可以访问单个副本。因此,由于您的类B扩展了a,因此B可以访问a的静态变量

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

有趣的引语“很难推测原因。一个可能的原因是,这样可以在不破坏任何派生类的情况下向基类添加成员,而这些派生类恰好有一个同名的成员。”。这是我没有考虑过的。
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;
}