Java 如果是父实例,instanceof是否返回true?
我有一个类Java 如果是父实例,instanceof是否返回true?,java,oop,inheritance,polymorphism,instanceof,Java,Oop,Inheritance,Polymorphism,Instanceof,我有一个类Child,它扩展了Parent Parent child = new Child(); if (child instanceof Parent){ // Do something } 这会返回true还是false,以及原因?,它会返回true还是false。为什么不呢 因为child实际上是Parent的一个实例。如果只想为子级执行操作,则应检查 if (child instanceof Child){ } 但是,你应该记住下面的语句,从有效C++,Scott Mey
Child
,它扩展了Parent
Parent child = new Child();
if (child instanceof Parent){
// Do something
}
这会返回true还是false,以及原因?,它会返回true还是false。为什么不呢
因为child实际上是Parent的一个实例。如果只想为子级执行操作,则应检查
if (child instanceof Child){
}
<>但是,你应该记住下面的语句,从有效C++,Scott Meyers:< /P>
“只要你发现自己在写作
“如果对象是
键入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
,它可以将Shape name或id作为数据成员,并具有GetName、Cleanup和其他功能,这些功能对所有形状都是通用的
记住,抽象类型不能被实例化,因此形状本身不能被实例化,因为它也不能被绘制
编辑2:多态性和异常处理-询问“检查异常类如何”异常处理与多态性相关的最佳实践有:
更喜欢(抛出)特定异常-例如,抛出NumberFormatException而不是IllegalArgumentException
首先捕获最特定的异常-例如,如果您首先捕获IllegalArgumentException,您将永远无法到达应处理更特定NumberFormatException的Catch块,因为它是IllegalArgumentException的子类
因此,基本上是一样的,如果需要以不同方式处理异常,则应定义子类/特定类,并捕获特定异常(未选中instanceof)
了解有关异常处理的更多最佳实践。请参阅和如果是子类,则instanceof将返回true
当然,它返回true,因为子对象是父对象的实例是实例
只要引用(实例
表达式的左侧)可以转换为引用类型(实例
表达式的右侧的类型),那么实例就会为true。这对于与其父类相关的子类来说是正确的:
Child child = new Child();
Parent parent = (Parent) child; //works!
assert child instanceof Parent; //true
发件人:
…
ReferenceType的关系表达式实例
…
在运行时,如果RelationalExpression的值不是
null
,则instanceof
运算符的结果是true
,并且引用可以转换为ReferenceType,而不引发ClassCastException
。否则结果是false
但是我在运行时确定了对象类型,我需要定义一个父引用来保存所有类型的子对象。我怎样才能用另一种方式做到这一点?@user479129:您可以在类型为parent的引用中保存对父对象的任何子对象的引用。这是因为存在一个
类parent{}
和class ChildA扩展父对象
和class ChildB扩展父对象
然后您可以使用父对象p
引用类型为ChildA
或ChildB
的对象,但我不明白您通过其他方式所指的意思。我需要控制对象p是其子对象的一种类型,而不是父对象。在某些情况下,它可以是父类型,所以我需要检查它是否正是我想要的类型。这就是我想要的。我希望它是明确的。我也希望得到一个改进的答案,这对使用Frame.getComponents()很有用不要单独处理每一个。@JasonK。你是说一个更好的例子吗?是的,如果子对象是父对象(或实现)的实例,java any将返回true。现在,这个问题总是正确的。谢谢