[英]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
,从而难以访问后者。 我已经看到人们期望这种行为具有多态性 ,但事实并非如此(无论如何,你的情况略有不同,因为Ai
是static
)。
我这里是一个静态变量。一个静态变量,在外行术语中,意味着所有类都可以访问一个副本。因此,因为你的类B扩展了A,所以B可以访问A的静态变量。
如果在本地定义变量,则变量的本地值会隐藏父类值。
有两种不同的东西,范围和可见性。 您不能在同一范围内重新定义变量两次(尽管您可以在嵌套范围中重新定义它们)。
但是在继承的情况下,子类超出了超类的范围,但由于继承而具有该变量的可见性。 所以子类允许你再次定义变量i
,虽然它会隐藏超类的变量。 你不会看到它的价值。 (除非使用任何来自超类的getter)
Java允许您更改扩展类的特定变量值。
这是因为,静态变量在同一个类的所有对象之间共享。 它是属于类的变量而不是对象(实例)。
因此,当扩展父类的静态变量实际上不是扩展类的一部分时,BUT是可访问的(只要它们不是私有的)。
此外,这可用于执行以下操作:
用于此目的是基于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:
您将看到表示不同节点类型的STATIC INTEGERS列表。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.