public class Car{ public void start(){ System.out.println("Car start"); } } public class CarA extents Car{ public void start(){ System.out.println("CarA start"); } } public class CarB extents Car{ public void start(){ System.out.println("CarB start"); } } public class DoMain{ public void startCar(Car car){ System.out.println("car start"); } public void startCar(CarA carA){ System.out.println("CarA start"); } public void startCar(CarB carB){ System.out.println("CarB start"); } public static void main(String[] args){ Car car = new Car(); Car carA = new CarA(); Car carB = new CarB(); DoMain domain = new DoMain(); domain.startCar(car); domain.startCar(carA); domain.startCar(carB); } }
這裏的結果很簡單:3次都是 Car start
,由於這裏涉及到了java中放入靜態綁定,也就是說domain
實例調用哪一個方法是在編譯期就肯定了,而編譯期間三次調用的方法的參數都是Car
類型的。而關於jvm的靜態綁定和動態綁定又是另一方面的內容了,因此這裏就不展開來說了。java
既然根據參數調用方法是在編譯時期肯定的,那麼怎麼能讓它展示出多態的性質了,也就是說雖然傳入的都是Car實例,可是我須要它表現出不一樣的性質出來。
這裏就須要一點小技巧了。相應的Domain須要改變一下dom
public class DoMain{ public void startCar(Car car){ car.start(); } public void startCar(CarA carA){ carA.start(); } public void startCar(CarB carB){ carB.start(); } public static void main(String[] args){ Car car = new Car(); Car carA = new CarA(); Car carB = new CarB(); DoMain domain = new DoMain(); domain.startCar(car); domain.startCar(carA); domain.startCar(carB); } }
這裏雖然調用的都是startCar(Car car)
可是在這個方法裏面還有一層調用就是car.start()
具體是哪一個Car調用它呢這個就會根據傳入的類型不一樣而執行的結果也不一樣。jvm