给定:
public class Base {
public static final String FOO = "foo";
public static void main(String[] args) {
Base b = new Base();
Sub s = new Sub();
System.out.print(Base.FOO); // <- foo
System.out.print(Sub.FOO); // <- bar
System.out.print(b.FOO); // <- foo
System.out.print(s.FOO); // <- bar
System.out.print(((Base)s).FOO); // <- foo
}
}
class Sub extends Base {
public static final String FOO="bar";
}
我的疑问是,在第 8 行和第 9 行中,我们使用引用变量来访问类的静态成员......这可能吗?因为静态成员只能通过类名访问...请纠正我哪里错了?
最佳答案
我选择选项D。
静态成员在编译时使用声明类型而不是实际类型进行解析。
这就是为什么 ((Base)s).FOO)
引用 Base.FOO
- 即使该对象是 Sub
。
这种情况也会发生,并且在下面有更好的说明:
Base b = new Sub(); // valid
System.out.print(b.FOO); // foo
这里 b.FOO
由于声明类型而引用 Base.FOO
,即使该实例是 Sub
。
关于java - 通过静态方法的静态成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18875500/