Java:层次结构继承的转换规则

Sal*_*ara 1 java casting

如图所示,我有一个继承类的层次结构。我正在寻找一个通用规则up to downdown to up规则。

我的意思是,我可以扮演哪一个?为什么?

Child ch;
Parent p=(Parent ) ch;
Run Code Online (Sandbox Code Playgroud)

或者

Parent p;
Child  ch=(Child  ) p;  
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

ysh*_*vit 5

您始终可以将 type 的引用隐式转换Child为 type 的引用Parent。您可以将 type 的引用显式转换Parent为 type 的引用,但如果引用的对象实际上不是 a ,则Child这可能会在运行时失败。ClassCastExceptionChild

不过,解释为什么会出现这种情况可能会有所帮助。

拥有类型引用的真正含义是什么Parent?它基本上意味着您可以使用任何Parent定义的方法(我在这里做了一些粉饰,特别是关于字段和nulls)。如果Child extends Parent,那么它继承所有这些方法。因此,将 type 的对象视为Childtype 的对象始终是安全的Parent,因为您想要从该Parent引用使用的任何方法也必须存在于该Child对象上。

Child c = getSomeObject();
Parent p = c;
p.doSomethingParental();
Run Code Online (Sandbox Code Playgroud)

即使引用p指向一个Child对象,它Child也会继承该doSomethingParental方法,因此这段代码可以正常工作。

反过来又如何呢?好吧,我们这么说Child extends Parent并添加一个方法beAGoodChild()。现在您有了一个Parent引用,并且您想将其转换为Child

Parent p = getSomeOtherObject();
Child c = (Child) p;
c.beAGoodChild();
Run Code Online (Sandbox Code Playgroud)

c显然,最后一行只有在确实是 a Child(而不仅仅是普通的 ol' )时才有效Parent。如果不是,那么捕获该错误的合理位置是在第二行,即我们进行转换的地方。这使得更容易、更快地发现错误;与其在我们尝试使用它们没有的方法时发现它们(这可能在转换发生很久之后发生),不如在转换时捕获它们,然后保证任何调用都将始终c.beAGoodChild()成功。基本上,它可以让你忽略“这真的是一个孩子吗?”的问题。除非在某些特定情况下(即铸造时)。