我的课程Child
扩展了Parent
。
Parent child = new Child();
if (child instanceof Parent){
// Do something
}
这会返回true还是false,为什么?
答案 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 ...
答案 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 ReferenceType15.20.2. Type Comparison Operator instanceof
...
在运行时,如果 RelationalExpression 的值不是instanceof
,则true
运算符的结果为null
,并且引用可以强制转换为 ReferenceType 而不提出ClassCastException
。否则结果为false
。