2013-10-14 66 views
0

我正在阅读有关在Java中将超类变量强制转换为子类的反例。请告诉哪些是有效的?在java中将子类变量强制转换为超类

Cat c = new Cat(); 
Animal a = c; 

Animal a = new Animal(); 
Cat c = (Cat) a; 

Animal a = new Cat(); 
Cat c = (Cat) a; 

Cat c = new Cat(); 
Dog d = (Dog) c; 

动物是与猫和狗子类的超级类。

+4

尝试一下,看看第一。 –

+0

你为什么不编译它们看看? –

+0

我的猜测是没有一个演员阵容是有效的,因为'猫'和'狗'不是任何类型的。 – Bart

回答

0
Cat c = new Cat(); 
Animal a = c; 

Animal a = new Cat(); 
Cat c = (Cat) a; 
+0

第一个你有在那里iffy,如果猫的构造函数设置了一些其他的东西? –

+0

如果猫吃了狗,该怎么办? – Troubleshoot

+0

把它投给老虎,也许 –

0

第三个是不错的方法acat,其他都是废话危险的编译器是否会允许它们。

+0

”。第一个也可以。这与将变量传递给期望超类的方法或将项添加到该项的超类型列表完全相同。当然这有点愚蠢,但这似乎是一个人为我做的早期作业。 –

+0

不,它不是,如果你通过猫作为动物,那么你只会调用动物中定义的方法。猫的任何额外的属性或方法不会按预期工作。也可能将它投射到蟑螂。 –

+0

如果他们被定义为虚拟(或者因为我们使用Java而不是最终的)或者被覆盖,他们会工作得很好。如果它们是新的方法或属性(所以在Cat上定义,但不在Animal上),它们只会通过Animal变量无法访问。这是整个继承点。如果猫和动物不这样做,这是一个坏设计的肯定标志(违反Liskov替代原则)。 –