为了账号安全,请及时绑定邮箱和手机立即绑定

请解释一下这种情况下的Java继承

请解释一下这种情况下的Java继承

慕森王 2024-01-05 10:14:12
我正在学习Java,无法理解继承的一些技巧。例子:我们有一个班级Animal;我们有一个类Cat,扩展Animal;我们有一个类Tiger,扩展Cat;问题:1)为什么Cat使用Tigers方法?请参阅下面的“make_a_sound”方法示例。它来自 Tiger,但 Cat 可以使用它。2)为什么Cat看不到Tiger的任何属性?猫可以使用老虎的方法“make_a_sound”,但看不到它的属性......很奇怪。谢谢,根纳迪public class Solution {    public static void main(string[] args) {        Cat cat = new Tiger();        // The result is from Tiger class: A tiger says RRRRR & new tiger property        // Why???        cat.make_a_sound();        // Only cat's and Animal's properties are visible. No Tiger's properties        System.out.println(cat.this_is_a_cat);    }    // Base class    public class Animal {        public String this_is_an_animal = "Animal";        public void make_a_sound() {            System.out.Printf("I'm an animal");        }    }    // Extends base class    public class Cat extends Animal {        public String this_is_a_Cat = "Hi, I'm a cat";        public void make_a_sound() {            System.out.Printf("A cat says meey");        }    }    // Extends prev. class    public class Tiger extends Cat {        public String this_is_a_Tiger = "Tiger";        public void make_a_sound() {            System.out.Println("A tiger says RRRRRR");            this_is_a_Tiger = "new tiger property";            System.out.println(new_tiger_property);        }    }}
查看完整描述

3 回答

?
Smart猫小萌

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);

}


查看完整回答
反对 回复 2024-01-05
?
白猪掌柜的

TA贡献1893条经验 获得超10个赞

此链接可以为您提供一些有关Java 中 覆盖的概念: https ://www.geeksforgeeks.org/overriding-in-java/

为了简单起见,Overriding仅对方法有效(关于问题1),而不对字段变量有效(关于问题2)。


查看完整回答
反对 回复 2024-01-05
?
慕码人8056858

TA贡献1803条经验 获得超6个赞

  1. 为什么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 中,每个类应该只知道它做什么,而不知道其他的。它不关心其他类的责任。


查看完整回答
反对 回复 2024-01-05
  • 3 回答
  • 0 关注
  • 56 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信