3 回答
TA贡献1911条经验 获得超7个赞
您定义cat为 type Cat。这意味着cat可以做任何其他人可以做的事情Cat。该Animal对象确实定义了该make_a_sound函数,因此它可用于所有Animal实例。当您运行代码时,该变量cat指向一个Tiger实例,因此当make_a_sound被调用时,它就是运行的实例Tiger。这就是继承的全部意义。
对于你的第二个问题,cat是类型,Cat所以你只能用它做你可以用任何Cat对象做的事情。由于this_is_a_Tiger不是每个对象都有的东西,所以即使Cat它确实指向.catcatTiger
但你可以这样做:
if (cat instanceof Tiger) {
Tiger tiger = (Tiger)cat;
System.out.println(tiger.this_is_a_Tiger);
}
TA贡献1893条经验 获得超10个赞
此链接可以为您提供一些有关Java 中 覆盖的概念: https ://www.geeksforgeeks.org/overriding-in-java/
为了简单起见,Overriding
仅对方法有效(关于问题1),而不对字段变量有效(关于问题2)。
TA贡献1803条经验 获得超6个赞
为什么Cat使用Tigers方法?请参阅下面的“make_a_sound”方法示例。它来自 Tiger,但 Cat 可以使用它。
回答)因为当你说 Cat cat = new Tiger() 时,你并不是说任何猫,而是说你想要老虎的声音,而不是任何通用的猫。Tiger 通过覆盖实现来使用猫的“make_a_sound”方法猛虎声响。
如果你没有覆盖 Tigers 的“make_a_sound”方法,那么 Cat 的“make_a_sound”方法将被调用。你可以通过在 Tiger 类中使用 super().make_a_sound 或删除此方法的实现来尝试。
2)为什么Cat看不到Tiger的任何属性?猫可以使用老虎的方法“make_a_sound”,但看不到它的属性......很奇怪。
回答)如果父类知道子类的一切,那么 OOPS 就会被破坏。在 OOPS 中,每个类应该只知道它做什么,而不知道其他的。它不关心其他类的责任。
添加回答
举报