【问题标题】:When is "obj instanceof Object" false in Java?Java中的“obj instanceof Object”何时为假?
【发布时间】:2009-08-27 14:22:57
【问题描述】:

考虑

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

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

【问题讨论】:

  • 这是一个面试题吗?

标签: java


【解决方案1】:

这是一个棘手的问题吗?

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

【讨论】:

  • 原谅我的无知,双括号是什么意思?
  • 双括号成语。外大括号是匿名内部类的语法(在这种情况下不定义任何方法)。内括号是一个实例初始化器(成为构造函数的一部分)。
  • 不幸的是,这会在创建时打印“false”,而不是在进行 instanceof 检查时打印;)
【解决方案2】:

这将打印错误:

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

这不是您要求的完全,但我能想到的最好的......

【讨论】:

    【解决方案3】:

    如果obj 不为空,这将从不返回 false

    【讨论】:

      【解决方案4】:

      一切都扩展了 Object,所以在这里你总是会得到 true(除非 obj 为 null)。

      【讨论】:

        【解决方案5】:

        每个对象都源自“对象”。您的陈述将始终正确。

        【讨论】:

          【解决方案6】:

          无 AFAIK。你把这个当作面试问题了吗?

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

          【讨论】:

            【解决方案7】:

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

            讨论here

            【讨论】:

            • "什么应该是 obj 以使答案为假(除 null 以外的任何其他选项)"
            【解决方案8】:

            很明显,如果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 中对此进行了测试,但如果其他编译器在类似这样的病态示例中表现不同,我不会感到惊讶。

            【讨论】:

            • 为什么泛型类搞得一团糟?这也是一样的:public static void main(String[] args) { Object v = (Object)"42"; class Object {} System.out.println(v instanceof Object); }
            • @Atmocreations,我写这篇文章已经有一段时间了,但由于某种原因,我认为它不会编译。我更喜欢你的例子(越简单越好)&我已经更新了我的匹配。
            • 嗯,没错。还没有看到这个帖子很老了 :D 好吧,我不想批评你。当我看到你的代码时,我不得不尝试它:P 从命令行编译并运行,因此这与 eclipse 无关。
            【解决方案9】:

            老问题,但是:

            • 如果 obj 为空
            • 如果您在 90 年代后期使用 jview 并尝试 Variant(不要记住该软件包)。

            【讨论】:

              【解决方案10】:

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

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 2015-01-13
                • 1970-01-01
                • 2015-02-22
                • 2013-03-19
                • 1970-01-01
                相关资源
                最近更新 更多