我正在阅读关于私有的内容,但我发现了这段代码......我不明白为什么当我放obj == 0
或obj == 1
时出现错误并且代码不起作用,但它只是在obj == null
。
您能否向我描述代码的工作原理以及为什么它在obj == null
时才起作用?
package person;
public class Cat {
private static Cat obj = null;
public Cat object () {
if(obj == null){
obj = new Cat();
}
return obj;
}
public void display() {
System.out.print("obj is null");
}
public static void main(String[] args) {
Cat myobj = new Cat();
myobj.display();
}
}
输出
obj is null
谢谢
答案 0 :(得分:3)
你不能将cat引用指向int原语,这没有任何意义。
它适用于null,因为所有引用都可以设置为null。 Null只表示引用指向任何内容。
答案 1 :(得分:0)
当它为null时,它起作用,因为在构造函数中正确创建了对象:
if(obj==null){
obj=new Cat();
}
将obj设置为1或0时会出现错误,因为JVM不知道如何将整数转换为Cat类。 如果你需要obj是一个整数,你可以将它声明为int而不是Cat。
答案 2 :(得分:0)
在Java中,您无法将基元类型与对象进行比较。通常,Java是类型安全的,如本wikipedia article
中所述 另一方面,C ++支持更多隐式类型转换(并且具有与Java不同的类型系统),其中像obj == 0这样的检查是检查对象上的空指针的可能方法。答案 3 :(得分:-2)
不,你不能。但你可以让我可以修改代码以使
obj == 0;
有效吗?
addressOf(obj) == 0;
使用丑陋的黑客:
package person;
import sun.misc.Unsafe;
import util.Dirty;
public class Cat {
private static Cat obj = null;
public Cat object () {
if(addressOf(obj) == 0){
obj = new Cat();
}
return obj;
}
public void display() {
System.out.print("obj is null");
}
public static void main(String[] args) {
Cat myobj = new Cat();
myobj.display();
}
static final Unsafe UNSAFE = /* ... */;
static final int REF_SIZE = /* ... */;
static final int OBJECT_ARRAY_BASE = UNSAFE.arrayBaseOffset(Object[].class);
public static long addressOf(Object o) {
return addressOf(o, REF_SIZE);
}
public static long addressOf(Object o, int oopSize) {
Object[] array = new Object[]{o};
switch (oopSize) {
case 4:
return UNSAFE.getInt(array, OBJECT_ARRAY_BASE) & 0xFFFFFFFFL;
case 8:
return UNSAFE.getLong(array, OBJECT_ARRAY_BASE);
default:
throw new Error("unsupported address size: " + oopSize);
}
}
}