我正在学习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);
}
}
}
答案 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
确实指向cat
,Tiger
也无法使用它。
但是您可以这样做:
if (cat instanceof Tiger) {
Tiger tiger = (Tiger)cat;
System.out.println(tiger.this_is_a_Tiger);
}
答案 1 :(得分:0)
答案)因为当您说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)无效。