我在练习单例模式时创建了一个类,如下所示:
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");
}
}
我知道这不完全正确。但是在主类中,在主函数中,我这样调用:
package common;
public class TestMain {
public static void main(String[] args) {
Singleton tmp = Singleton.getInstance();
tmp = null;
System.out.println(tmp);
tmp.getDemo();
}
}
这是什么指纹:
Yahoo
null
YOHOO
但是,当第二次调用()时,为什么不使用空指针呢?我不确定我是否遗漏了任何范围的细节,但希望得到帮助。
发布于 2018-07-17 08:49:11
通过类的前缀或类类型声明的变量来访问静态方法,将产生相同的结果。
编译器不会计算tmp
对象来调用方法,而是直接调用静态方法。
正如JLS所指出的:
15.12.4.1.计算目标引用(如有必要) 根据方法调用的形式,有六种情况需要考虑:
- If the invocation mode is static, then there is no target reference.
注意,编译器还应该发出以下警告:
应该以静态方式访问来自Singleton类型的静态方法getDemo()
因此,您应该遵循此建议,并将其替换为:
Singleton.getDemo();
已编译类的main()
方法的反汇编版本显示:
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
}
发布于 2018-07-17 08:52:04
您正在调用的方法是一个静态方法。它不依赖于指针值。它只看到要调用该方法的引用类型。
https://stackoverflow.com/questions/51376788
复制相似问题