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 设置为 null 。但是编译器不应该知道 我们正在访问一种非静态方法 通过静态参考变量? 这在执行时会给出空指针异常,但是为什么编译器没有给出 错误。
这是否意味着静态引用变量的行为与对象引用完全相同,因此可以调用该类的任何方法(静态和非静态)?
编辑:我基本上对静态字段的访问规则感到困惑。 根据定义,静态字段只能直接访问其他静态字段。 那么,这不包括“调用” 使用静态引用变量的方法吗? 并且display()在创建其对象之前被访问。这有效吗?
答案 0 :(得分:1)
“您一直在使用该词。我认为这并不意味着您认为的意思。”
您的代码中的static A a;
说,“ a
是A
类型的对象(对它的引用),在类B
的所有实例之间共享。{ {1}}尚未初始化。”。
编译器将没有上下文来确定何时调用类a
的静态main()
方法,因此它无法确定变量C
的状态在您致电a
时。实际上,您可以轻松拥有D类:
C.main();
这将使上面的代码完全有效且可运行。