>  Q&A  >  본문

java - 子类重写的方法和父类重写的方法,两个之间的调用

1.当子类对象调用重写的方法时,调用的是子类的方法,而不是父类中被重写的方法
要想调用父类中被重写的方法,则必须使用关键字super。
这句话该怎么理解呢?子类对象调用重写方法,

public class Test {
    public static void main(String[] args) {
      show(new Cat());  // 以 Cat 对象调用 show 方法
      show(new Dog());  // 以 Dog 对象调用 show 方法
                
      Animal a = new Cat();  // 向上转型  
      a.eat();               // 调用的是 Cat 的 eat
      Cat c = (Cat)a;        // 向下转型  
      c.work();        // 调用的是 Cat 的 catchMouse
  }  
            
    public static void show(Animal a)  {
      a.eat();  
        // 类型判断
        if (a instanceof Cat)  {  // 猫做的事情 
            Cat c = (Cat)a;  
            c.work();  
        } else if (a instanceof Dog) { // 狗做的事情 
            Dog c = (Dog)a;  
            c.work();  
        }  
    }  
}
 
abstract class Animal {  
    abstract void eat();  
}  
  
class Cat extends Animal {  
    public void eat() {  
        System.out.println("吃鱼");  
    }  
    public void work() {  
        System.out.println("抓老鼠");  
    }  
}  
  
class Dog extends Animal {  
    public void eat() {  
        System.out.println("吃骨头");  
    }  
    public void work() {  
        System.out.println("看家");  
    }  
}
这里的子对象cat和dog,调用的都是父类的eat。怎么说“当子类对象调用重写的方法时,调用的是子类的方法,而不是父类中被重写的方法”?这话怎么理解呢?
要想调用父类中被重写的方法,则必须使用关键字super
迷茫迷茫2744일 전868

모든 응답(1)나는 대답할 것이다

  • 怪我咯

    怪我咯2017-04-18 10:51:04

    이 예제에서는 super를 사용하지 않습니다. 상위 클래스의 eat 메소드를 구현한 다음 하위 클래스에서 super.eat();

    을 사용하는 것이 좋습니다.
    1. “하위 클래스 객체가 재정의된 메서드를 호출하면 상위 클래스의 재정의된 메서드가 아닌 하위 클래스의 메서드가 호출됩니다.”
      다형성에 대해 알아야 합니다. 클래스는 하위 클래스의 인스턴스를 가리키므로 하위 클래스의 메서드가 호출됩니다.

      그런데 상위 클래스의 메소드(eat)를 호출하려면 어떻게 해야 할까요?
    2. 2. super의 사용
    예:

    으아아아
    아빠반 먹다...
    생선먹기

    쥐잡기

    뼈먹기
    집 지키기
    아빠반 먹음...
    생선먹기
    쥐잡기

    회신하다
    0
  • 취소회신하다