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

时间:2011-06-10 08:49:53

标签: java oop inheritance polymorphism instanceof

我的课程Child扩展了Parent

Parent child = new Child();

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

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

4 个答案:

答案 0 :(得分:52)

Yes,它会的。为什么不呢?

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

if (child instanceof Child){
}

但是你应该记住Scott Meyers的以下有效C ++声明:

  

“任何时候你发现自己在写作   形式的代码“如果对象是   键入T1,然后执行某些操作,但是如果   这是T2型,然后做点什么   否则,“打自己。”

我认为也适用于这种情况。如果您想根据引用对象所属的类类型 doSomething ,以下代码结构应该可以帮助您。

注意:我没有编译它。

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() {

        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本身无法实例化,因为它也无法绘制。

答案 1 :(得分:5)

instanceof 如果是子类,则返回true ...

instanceof Documentation

答案 2 :(得分:0)

ofcourse它返回true,因为child是父

的实例

答案 3 :(得分:0)

即可。只要引用(instanceof表达式的左侧)可以强制转换为 ReferenceType instanceof右侧的类型,instanceof就会为真表达)。对于与其父级相关的子类,这将是正确的:

Child child = new Child();
Parent parent = (Parent) child; //works!
assert child instanceof Parent; //true

来自The Java Language Specification, Java SE 9 Edition

  

15.20. Relational Operators
  ...
   RelationalExpression instanceof ReferenceType

     

15.20.2. Type Comparison Operator instanceof
  ...
  在运行时,如果 RelationalExpression 的值不是instanceof,则true运算符的结果为null,并且引用可以强制转换为 ReferenceType 而不提出ClassCastException。否则结果为false