在这种情况下,请说明Java继承

时间:2019-10-29 05:56:41

标签: java

我正在学习Java,无法理解继承的一些技巧。 示例:

  • 我们有一个Animal类;
  • 我们有一个Cat类,扩展了Animal;
  • 我们有一个Tiger类,扩展了Cat;

问题:

1)为什么猫使用老虎方法? 请参见下面的“ make_a_sound”方法示例。它来自老虎,但猫可以使用。

2)为什么猫,看不到老虎的任何属性? 猫可以使用Tiger的方法“ make_a_sound”,但看不到它的属性...很奇怪。

谢谢, 根纳季(Jennadiy)

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 个答案:

答案 0 :(得分:1)

您将cat定义为类型Cat。这意味着cat可以做任何其他Cat可以做的事情。 Animal对象确实定义了make_a_sound函数,因此它可用于所有Animal实例。运行代码时,变量cat指向一个Tiger实例,因此当调用make_a_sound时,它就是Tiger中运行的那个。这就是继承的全部内容。

对于第二个问题,cat的类型为Cat,因此您只能使用它可以对任何Cat对象进行操作。由于this_is_a_Tiger并不是每个Cat对象都拥有的东西,因此即使cat确实指向catTiger也无法使用它。

但是您可以这样做:

if (cat instanceof Tiger) {
   Tiger tiger = (Tiger)cat;
   System.out.println(tiger.this_is_a_Tiger);
}

答案 1 :(得分:0)

  1. 为什么猫使用Tigers方法?请参见下面的“ make_a_sound”方法示例。它来自老虎,但猫可以使用。

答案)因为当您说Cat cat = new Tiger()时,您不是在说任何猫,而是在说您想要的是Tiger的声音,而不是任何通用的cat。Tiger通过过度使用cat的“ make_a_sound”方法由Tigers实施。

如果您没有覆盖Tigers的“ make_a_sound”方法,则将调用Cat的“ make_a_sound”方法。您可以通过在Tiger类中说出super()。make_a_sound或删除该方法的实现来进行尝试。

2)为什么猫,看不到老虎的任何属性?猫可以使用Tiger的方法“ make_a_sound”,但看不到它的属性...很奇怪。

答案)如果父母班级对孩子班级一无所知,那么OOPS将被打破。在OOPS中,每个班级仅应了解其做什么而无其他事情,它不关心其他班级责任。

答案 2 :(得分:0)

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

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