在上一章節(jié)中,我們討論了父類和子類。如果一個(gè)類從它的父類繼承了一個(gè)方法,如果這個(gè)方法沒有被標(biāo)記為 final ,就可以對(duì)這個(gè)方法進(jìn)行重寫。
重寫的好處是:能夠定義特定于子類類型的行為,這意味著子類能夠基于要求來實(shí)現(xiàn)父類的方法。
在面向?qū)ο缶幊讨校?overriding 意味著去重寫已經(jīng)存在的方法。
讓我們來看以下的例子:
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
}
}
這將產(chǎn)生如下結(jié)果:
Animals can move
Dogs can walk and run
在上面的例子中,你可以看到盡管 b 是 Animal 類型,但它運(yùn)行了 dog 類的方法。原因是:在編譯時(shí)會(huì)檢查引用類型。然而,在運(yùn)行時(shí),JVM 會(huì)判定對(duì)象類型到底屬于哪一個(gè)對(duì)象。
因此,在上面的例子中,雖然 Animal 有 move 方法,程序會(huì)正常編譯。在運(yùn)行時(shí),會(huì)運(yùn)行特定對(duì)象的方法。
考慮下面的例子:
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 bark(){
System.out.println("Dogs can bark");
}
}
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.bark();
}
}
這將產(chǎn)生如下結(jié)果:
TestDog.java:30: cannot find symbol
symbol : method bark()
location: class Animal
b.bark();
^
這個(gè)程序在編譯時(shí)將拋出一個(gè)錯(cuò)誤,因?yàn)?b 的引用類型 Animal 沒有一個(gè)名字叫 bark 的方法。
當(dāng)調(diào)用父類的被重寫的方法時(shí),要用關(guān)鍵字 super。
class Animal{
public void move(){
System.out.println("Animals can move");
}
}
class Dog extends Animal{
public void move(){
super.move(); // invokes the super class method
System.out.println("Dogs can walk and run");
}
}
public class TestDog{
public static void main(String args[]){
Animal b = new Dog(); // Animal reference but Dog object
b.move(); //Runs the method in Dog class
}
}
這將產(chǎn)生如下結(jié)果:
Animals can move
Dogs can walk and run