什么时候Java中的“obj instanceof Object”为false?

时间:2009-08-27 14:22:57

标签: java

考虑

 Object obj = ....;
 System.out.println(obj instanceof Object);

应该是什么,以便答案是falsenull以外的任何其他选项)

10 个答案:

答案 0 :(得分:39)

这是一个棘手的问题吗?

Object obj = new Object() {{ System.out.println(false); System.exit(0); }};
System.out.println(obj instanceof Object);

答案 1 :(得分:11)

这将打印false:

public final class Foo {
    static private final class Object {
    }

    static public void main(String[] args)
    {
        java.lang.Object o = new java.lang.Object();
        System.out.println(o instanceof Object);
    }
}

这不是相当你所要求的,但我能想到的最好......

答案 2 :(得分:9)

如果obj为非空

永远不会返回false

答案 3 :(得分:6)

一切都扩展了对象,所以你总是在这里得到真实(除非obj为null)。

答案 4 :(得分:1)

每个对象都来自'对象'。您的陈述将始终为真。

答案 5 :(得分:0)

无AFAIK。你有没有把它作为面试问题?

By definition,如果可以将变量转换为Object,则它应该返回true,并且所有非null都应该是可转换的。也许泛型有一些技巧,但我对此表示怀疑。

答案 6 :(得分:0)

使其成为假的唯一方法是不给它一个对象,给它一个空引用

讨论 here

答案 7 :(得分:0)

显然,如果Object引用java.lang.Object(由引导类加载器定义),则这是不可能的,因为进程中的每个类都必须从java.lang.Object下降

但是,您可以在内部范围中定义名为Object的其他内容,隐藏java.lang.Object

以下是一个示例,其中名称Object在方法开头引用java.lang.Object,后来引用本地类:

public static void main(String[] args) {
    Object value = "42"; class Object {}
    System.out.println(value instanceof Object);
}

这是一个轻微的欺骗,因为value的声明不是单个语句,而是一个语句后跟本地类定义。

我在Eclipse 3.5.0中对此进行了测试,但如果其他编译器的行为与此类病态示例不同,我也不会感到惊讶。

答案 8 :(得分:0)

古老的问题,但是:

  • 如果obj为空
  • 如果您在90年代后期使用jview并尝试使用Variant(请勿记住包装)。

答案 9 :(得分:0)

它也可以是原始对象的实例,如int,double,boolean等。如果这样做,它也可能返回false