class A{
void display(){
System.out.println("hai");
}
}
class B {
static A a;
}
class C{
public static void main(String args[])
{
B.a.display();
// no compile- time error here.why?
}
}
另外,我知道在运行时,a将被设置为空。但是编译器不应该知道我们正在通过静态引用变量访问非静态方法吗?这在执行时会产生一个空指针异常,但是为什么编译器不会给出错误呢?
这是否意味着静态引用变量的行为与对象引用完全相同,因此可以调用类的任何方法(静态和非静态)?
编辑:我基本上对静态字段的访问规则感到困惑。根据定义,静态字段只能直接访问其他静态字段。那么,这不包括使用静态引用变量“调用”方法吗?并在创建其对象之前访问display()。这是有效的吗?
发布于 2018-10-05 05:23:52
“你一直在用这个词。我不认为它的意思是你想的那样。”
代码中的static A a;
说明:"a
是一个A
类型的对象(引用),它在B
类的所有实例之间共享。a
未初始化。“
编译器将没有上下文来确定您何时调用类C
的静态main()
方法,因此它无法知道您调用C.main();
时变量a
的状态。事实上,你可以很容易地得到一个D类:
class D
{
public static void main( String args[] )
{
B.a = new A();
C.main( args );
}
}
这将使上面的代码完全有效和可运行。
https://stackoverflow.com/questions/52654818
复制相似问题