如果父实例,instanceof 是否返回 true?

新手上路,请多包涵

我有一个类 Child 扩展了 Parent

 Parent child = new Child();

if (child instanceof Parent){
    // Do something
}

这会返回 true 还是 false,为什么?

原文由 ikbal 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 453
2 个回答

的,会的。为什么不呢?

因为 child 实际上是 Parent 的一个实例。如果您只想为孩子执行操作,您应该检查

if (child instanceof Child){
}

但是,您应该记住 Effective C++ 中 Scott Meyers 的以下声明:

“任何时候你发现自己编写的代码的形式是“如果对象是 T1 类型,那么做一些事情,但如果它是 T2 类型,那么做其他事情”,打你自己一巴掌。

我认为这也适用于这种情况。如果你想根据引用对象属于什么类型的类 来做 一些事情,下面的代码结构应该可以帮助你。

注意: 我还没有编译它。

 class Parent {
    public void doSomething() {
        System.out.println("I am the Parent, and I do as I like");
    }
}

class ChildA extends Parent {
    public void doSomething() {
        System.out.println("I am a child named A, but I have my own ways, different from Parent");
    }
}

class ChildB extends Parent {
    public void doSomething() {
        System.out.println("I am a child named B, but I have my own ways, different from my Parent and my siblings");
    }
}

public class Polymorphism101 {

    public static void main(String[] args) {

        Parent p = new Parent();
        p.doSomething();

        p = new ChildA();
        p.doSomething();

        p = new ChildB();
        p.doSomething();

    }

}

编辑:一个更好的例子

您可能正在开发 绘图 应用程序。绘制任何形状的应用程序。在这种情况下,您应该有一个 抽象 类型 Shape

出于以下目的;绘制所有形状;列出所有形状;查找形状或删除形状,您需要有一个形状 _列表_。由于列表是父类型,因此它可以存储任何形状。

Shape 接口/抽象类/虚类 应该有一个 抽象/纯虚 函数 Draw() 。因此,在 DrawToDeviceLoop 中,您只需为每个形状调用 Draw() ,您无需检查它是什么形状。

Shape 接口可以有一个 抽象 实现 AbstractShape ,它可以有形状名称或 id 作为数据成员和 GetName、Cleanup 和其他具有所有形状通用功能的函数。

请记住,抽象类型 不能 被实例化,所以 Shape 本身不能被实例化,因为它也不能被绘制。

编辑 2:多态性和异常处理- user1955934 问“如何检查异常类”对于异常处理,关于多态性的最佳实践是:

  1. 更喜欢(抛出)特定异常 - 例如抛出 NumberFormatException 而不是 IllegalArgumentException
  2. 首先捕获最具体的异常 - 例如,如果您首先捕获 IllegalArgumentException,您将永远不会到达应该处理更具体的 NumberFormatException 的 catch 块,因为它是 IllegalArgumentException 的子类。

所以,它基本上是一样的,如果需要以不同的方式处理异常,则应该定义一个子/特定类,并且应该 捕获 特定的异常(不检查 instanceof)

了解更多关于异常处理的最佳实践。请参阅 在 Java 中处理异常的 9 个最佳实践和异常的 最佳实践 (C#)

编辑 3:我承认这条规则有一个例外

因此,我正在使用遗留代码(用 C++ 编写),该代码大部分是大约 15 年前编写的,它们总是检查子类以执行某些操作。我被要求添加一些具有相同逻辑的代码,我告诉我的经理(他也是开发人员)我不能这样做,指向这个答案,然后我们讨论并接受了这个规则的例外。在我们的案例中,这个父类自 2000 年以来只有 2 个子类,并且我们看不到在不久的将来会添加任何子类,由于核心代码增长受限,我们决定不添加子类和当前number 仅为 2,检查类型更有效,特别是当代码是这样编写的时,从那时起。

虽然这种检查的实例也不多,但父级主要实现了复杂的功能,它更多地用于共享代码然后专门化/区分它们。

原文由 Ozair Kafray 发布,翻译遵循 CC BY-SA 4.0 许可协议

如果它是一个子类, instanceof 将返回 true …

文档实例

原文由 Yochai Timmer 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题