首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Java静态引用变量调用非静态方法

Java静态引用变量调用非静态方法
EN

Stack Overflow用户
提问于 2018-10-05 04:39:53
回答 1查看 198关注 0票数 2
代码语言:javascript
复制
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()。这是有效的吗?

EN

回答 1

Stack Overflow用户

发布于 2018-10-05 05:23:52

“你一直在用这个词。我不认为它的意思是你想的那样。”

代码中的static A a;说明:"a是一个A类型的对象(引用),它在B类的所有实例之间共享。a未初始化。“

编译器将没有上下文来确定您何时调用类C的静态main()方法,因此它无法知道您调用C.main();时变量a的状态。事实上,你可以很容易地得到一个D类:

代码语言:javascript
复制
class D
{
    public static void main( String args[] )
    {
        B.a = new A();
        C.main( args );
    }
}

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52654818

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档