以此为例:
class Animal{
public void move(){
System.out.println("Animals can move");
}
}
class Dog extends Animal{
public void move(){
System.out.println("Dogs can walk and run");
}
}
public class TestDog{
public static void main(String args[]){
Animal a = new Animal(); // Animal reference and object
Animal b = new Dog(); // Animal reference but Dog object
a.move();// runs the method in Animal class
b.move();//Runs the method in Dog class
}
}
这里是否正确地说在调用b.move()时,方法“Dog类下的move()”覆盖了Animal类下的“move()”,因为Dog对象在调用相同的方法时优先当被Animal类型引用时?
我注意到很多网站都没有解释这一点,而是他们只是抛出一些例子,而不是逐行讨论。只是想清理我的术语混淆。
旁注,是否可以拥有Dog对象但是调用Animal类下的move()?例如:
Dog doggy = new Dog();
doggy.move()
>>>
Animals can move
>>>
这可能吗?会((动物)小狗).move()完成这个吗?
答案 0 :(得分:5)
当然,在b.move()
类"下调用move()
方法" Dog
时,这是正确的。已覆盖move()
类"下的" Animal
。
对于第二个问题,您应该将类Dog实现为:
public class Dog extends Animal {
public void move(){
super.move();
}
}
对于第三个问题,答案是"否"。
((Animal) doggy).move()
这简直是多余的'并在move()
类"下提供输出" Dog
。
答案 1 :(得分:1)
你可以这样做
class Animal{
public void move(){
System.out.println("Animals can move");
}
}
class Dog extends Animal{
public void move(){
System.out.println("Dogs can walk and run");
}
public void moveParent() {
super.move();
}
}
public class Main{
public static void main(String args[]){
Animal a = new Animal(); // Animal reference and object
Animal b = new Dog(); // Animal reference but Dog object
a.move();// runs the method in Animal class
b.move();//Runs the method in Dog class
Dog doggy = new Dog();
doggy.moveParent();
}
}
答案 2 :(得分:0)
使用超级关键字来调用父成员函数或数据成员。
喜欢: super.move(); 在这种情况下,您的父函数将被调用。
答案 3 :(得分:0)
如果两个或多个独立定义的默认方法冲突,或者默认方法与抽象方法冲突,则Java编译器会产生编译器错误。您必须显式覆盖超类型方法。
所以基本上,如果你在子类中调用一个超类中的方法,你将无法调用超类#'方法,除非您使用super.function()
。 Read up more on it here
答案 4 :(得分:0)
它的主要面向对象编程(又名OOP) - 多态。狗,猫,大象都是动物。
Animal d = new Dog();
Animal c = new Cat();
Animal t = new Tiger()
它一定不在乎,永远是对的。 :)