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

我正在学习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);

        }

    }

}


慕森王
浏览 67回答 3
3回答

Smart猫小萌

您定义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);}

白猪掌柜的

此链接可以为您提供一些有关Java 中 覆盖的概念: https ://www.geeksforgeeks.org/overriding-in-java/为了简单起见,Overriding仅对方法有效(关于问题1),而不对字段变量有效(关于问题2)。

慕码人8056858

为什么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 中,每个类应该只知道它做什么,而不知道其他的。它不关心其他类的责任。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java