Java中的二次分發

java中的二次分發

簡單的例子

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

相關文章
相關標籤/搜索