重寫:子類對父類的允許訪問的方法的實現過程進行重新編寫!返回值和形參都不能改變。即:外殼不變,核心重寫!
好處:可以根據子類的需要,定義特定於自己的行為。也就是說子類能夠根據需要實現父類的方法。
class Animal{
public void move(){
System.out.println("動物可以移動");
}
}
class Dog extends Animal{
public void move(){
System.out.println("狗可以跑和走");
}
}
public class AnimalThree{
public static void main(String args[]){
Animal a = new Animal(); // Animal 對象
Animal b = new Dog(); // Dog 對象
a.move();// 執行 Animal 類的方法
b.move();//執行 Dog 類的方法
}
}
在上面的例子中可以看到,盡管b屬於Animal類型,但是它運行的是Dog類的move方法。
這是由於在編譯階段,只是檢查參數的引用類型。
然而在運行時,Java虛擬機(JVM)指定對象的類型並且運行該對象的方法。
因此在上面的例子中,之所以能編譯成功,是因為Animal類中存在move方法,然而運行時,運行的是特定對象的方法。
下例是錯誤的:
class Animal{
public void move(){
System.out.println("動物可以移動");
}
}
class Dog extends Animal{
public void move(){
System.out.println("狗可以跑和走");
}
public void bark(){
System.out.println("狗可以吠叫");
}
}
public class AnimalFour{
public static void main(String args[]){
Animal a = new Animal(); // Animal 對象
Animal b = new Dog(); // Dog 對象
a.move();// 執行 Animal 類的方法
b.move();//執行 Dog 類的方法
b.bark();
}
}
這個例子編譯無法通過,應該將對象b聲明那裡改為“Dog b=new Dog();”,得到的正確結果是: