首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >单例设计模式中的Java静态对象范围不抛空指针异常

单例设计模式中的Java静态对象范围不抛空指针异常
EN

Stack Overflow用户
提问于 2018-07-17 08:38:49
回答 2查看 162关注 0票数 2

我在练习单例模式时创建了一个类,如下所示:

代码语言:javascript
运行
复制
class Singleton
{
    // static variable single_instance of type Singleton
    private static final Singleton single_instance = new Singleton();

    // private constructor restricted to this class itself
    private Singleton()
    {
        System.out.println("Yahoo");
    }

    // static method to create instance of Singleton class
    public static Singleton getInstance()
    {
        return single_instance;
    }
    public static void getDemo()
    {
        System.out.println("YOHOO");
    }
}

我知道这不完全正确。但是在主类中,在主函数中,我这样调用:

代码语言:javascript
运行
复制
package common;

public class TestMain {

    public static void main(String[] args) {
        Singleton tmp = Singleton.getInstance();
        tmp = null;
        System.out.println(tmp);
        tmp.getDemo();

    }

}

这是什么指纹:

代码语言:javascript
运行
复制
Yahoo
null
YOHOO

但是,当第二次调用()时,为什么不使用空指针呢?我不确定我是否遗漏了任何范围的细节,但希望得到帮助。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-07-17 08:49:11

通过类的前缀或类类型声明的变量来访问静态方法,将产生相同的结果。

编译器不会计算tmp对象来调用方法,而是直接调用静态方法。

正如JLS所指出的:

15.12.4.1.计算目标引用(如有必要) 根据方法调用的形式,有六种情况需要考虑:

  • 如果表单是MethodName --也就是说,只是一个标识符--那么:
代码语言:javascript
运行
复制
- If the invocation mode is static, then there is no target reference.

注意,编译器还应该发出以下警告:

应该以静态方式访问来自Singleton类型的静态方法getDemo()

因此,您应该遵循此建议,并将其替换为:

代码语言:javascript
运行
复制
Singleton.getDemo();

已编译类的main()方法的反汇编版本显示:

代码语言:javascript
运行
复制
  public static void main(java.lang.String[]);
    Code:
       0: invokestatic  #16                 // Method common/Singleton.getInstance:()Lcommon/Singleton;
       3: astore_1
       4: aconst_null
       5: astore_1
       6: getstatic     #22                 // Field java/lang/System.out:Ljava/io/PrintStream;
       9: aload_1
      10: invokevirtual #28                 // Method java/io/PrintStream.println:(Ljava/lang/Object;)V
      13: invokestatic  #34                 // Method Lcommon/Singleton.getDemo:()V
      16: return
}
票数 1
EN

Stack Overflow用户

发布于 2018-07-17 08:52:04

您正在调用的方法是一个静态方法。它不依赖于指针值。它只看到要调用该方法的引用类型。

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

https://stackoverflow.com/questions/51376788

复制
相关文章

相似问题

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