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

ikb*_*bal 46 java oop polymorphism inheritance instanceof

我有一个课程Child延伸Parent.

Parent child = new Child();

if (child instanceof Parent){
    // Do something
}
Run Code Online (Sandbox Code Playgroud)

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

Oza*_*ray 58

是的,它会的.为什么不呢?

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

if (child instanceof Child){
}
Run Code Online (Sandbox Code Playgroud)

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

"任何时候你发现自己编写表单的代码"如果对象是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();

    }

}
Run Code Online (Sandbox Code Playgroud)

编辑:一个更好的例子

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

出于某些目的; 绘制所有形状; 列出所有形状; 找到一个形状或删除一个形状,你需要有一个形状列表.由于列表是父类型,因此它可以存储任何形状.

Shape 接口/抽象类/虚拟类应该有一个抽象/纯虚函数Draw().所以,在你的DrawToDeviceLoop中,你只需要调用Draw()每个形状,你永远不需要检查它是什么形状.

Shape接口可以具有抽象实现AbstractShape,其可以具有形状名称或id作为数据成员以及GetName,Cleanup和具有所有形状共有功能的其他功能.

请记住,抽象类型无法实例化,因此Shape无法实例化,因为它也无法绘制.


Yoc*_*mer 6

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

instanceof文档