调用非静态方法的Java静态参考变量

时间:2018-10-04 20:39:53

标签: java object reference static static-methods

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()在创建其对象之前被访问。这有效吗?

1 个答案:

答案 0 :(得分:1)

“您一直在使用该词。我认为这并不意味着您认为的意思。”

您的代码中的static A a;说,“ aA类型的对象(对它的引用),在类B的所有实例之间共享。{ {1}}尚未初始化。”。

编译器将没有上下文来确定何时调用类a的静态main()方法,因此它无法确定变量C的状态在您致电a时。实际上,您可以轻松拥有D类:

C.main();

这将使上面的代码完全有效且可运行。