Java中重写override的概念解释

3

以这个为例:

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()方法”,因为当使用Animal类型引用相同方法时,Dog对象优先调用?

我注意到很多网站没有解释这个问题,只是举出例子,没有逐行讲解。我只想澄清一下术语混淆的问题。

另外,是否可能拥有一个Dog对象,但调用的是在Animal类下的move()方法?例如:

Dog doggy = new Dog();
doggy.move()
>>>
Animals can move
>>>

这是否可行?((Animal) doggy).move() 是否能实现这一点?


此外,使用 @Override 注释可以防止您在子类中拼写方法名称时出现错误。 - jam
5个回答

5
当调用b.move()方法时,可以肯定地说"Dog类下的move()方法"已经覆盖了"Animal类下的move()方法"。
对于第二个问题,您应该按照以下方式实现Dog类:
public class Dog extends Animal {

   public void move(){
     super.move();
   }
}

第三个问题的答案是“不”。

          ((Animal) doggy).move()

这只是“冗余的”,并输出“Dog类下的move()”。

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

   }
}

0

这是面向对象编程(即OOP)的原则 - 多态性。狗、猫、大象都是动物。

Animal d = new Dog();
Animal c = new Cat();
Animal t = new Tiger()

它不必在意,总是正确的。:)


0
使用super关键字调用父类的成员函数或数据成员。
例如:super.move();在这种情况下,将会调用你的父类函数。

0

来自Oracle文档

如果两个或多个独立定义的默认方法冲突,或者默认方法与抽象方法冲突,则Java编译器会产生编译器错误。您必须显式地覆盖超类型方法。

所以基本上,如果你在子类中调用一个在超类中的方法,除非你使用super.function(),否则你将无法调用超类的方法。在这里阅读更多信息


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接