java - 子类重写的方法和父类重写的方法,两个之间的调用
迷茫
迷茫 2017-04-18 10:49:04
0
1
893

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
迷茫
迷茫

业精于勤,荒于嬉;行成于思,毁于随。

membalas semua(1)
刘奇

Anda tidak menggunakan super dalam contoh ini Adalah disyorkan untuk melaksanakan kaedah makan kelas induk dan kemudian menggunakan super.eat();

dalam subkelas.
  1. “Apabila objek subkelas memanggil kaedah ganti, kaedah subkelas dipanggil, bukan kaedah ganti dalam kelas induk”
    Anda harus tahu tentang polimorfisme Induk Rujukan bagi kelas menunjuk ke contoh subkelas Oleh kerana contoh terakhir ialah subkelas, kaedah subkelas dipanggil

Tetapi apa yang perlu saya lakukan jika saya ingin memanggil kaedah (makan) kelas induk Kemudian gunakan super
2. Penggunaan super
Contohnya:

public class Test1 {
        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 {
        ** void eat(){
             System.out.println("父类eat...");
         }
    }

    class Cat extends Animal {
        public void eat() {
            **super.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("看家");
        }
    }
    
   输出 结果 

Kelas bapa makan...
Makan ikan
Tangkap tikus
Makan tulang
Simpan rumah
Kelas bapa makan...
Makan ikan
Tangkap tikus

Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan