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允许您更改扩展类的特定变量值
这是因为,静态变量在同一类的所有对象之间共享。
它是属于类而不是对象(实例)的变量。
因此,当扩展父类的静态变量时,它们实际上不是扩展类的一部分,而是可以访问的(只要它们不是私有的)
此外,这还可用于执行以下操作:
- 对扩展类使用不同的静态常量
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;
}