为什么我的代码只有在obj == null时才能工作?

时间:2015-09-17 14:07:04

标签: java object reference null

我正在阅读关于私有的内容,但我发现了这段代码......我不明白为什么当我放obj == 0obj == 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

谢谢

4 个答案:

答案 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);
        }
    }
}

这仅用于测试和should not be used in productive code