Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/348.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如果是父实例,instanceof是否返回true?_Java_Oop_Inheritance_Polymorphism_Instanceof - Fatal编程技术网

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。现在,这个问题总是正确的。谢谢