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允许在B类中定义另一个变量i
?
答案 0 :(得分:1)
A
的所有子类中都显示A
的公共成员或受保护成员。
如果静态变量i被继承,为什么java允许在B类中定义另一个变量i?
很难推测为什么。一个可能的原因是,这允许人们将成员添加到基类,而不会破坏任何已经碰巧具有相同名称的成员的派生类。
请注意,如果您在i
中定义另一个B
,它将 shadow A.i
,从而难以访问后者。 I've seen people expecting this to behave polymorphically,但它没有(无论如何,您的情况略有不同,因为A.i
是static
)。
答案 1 :(得分:1)
我这里是一个静态变量。一个静态变量,在外行术语中,意味着所有类都可以访问一个副本。因此,由于你的B类扩展了A,B可以访问A的静态变量。
如果在本地定义变量,则变量的本地值会隐藏父类值。
答案 2 :(得分:0)
有两种不同的东西,范围和可见性。您不能在同一范围内重新定义变量两次(尽管您可以在嵌套范围中重新定义它们)。
但是在继承的情况下,子类超出了超类的范围,但由于继承而具有该变量的可见性。所以子类允许你再次定义变量i
,虽然它会隐藏超类的变量。你不会看到它的价值。 (除非使用任何来自超类的getter)
答案 3 :(得分:0)
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列表。