網頁

2018/2/24

Java 什麼是多載(Overload), 覆寫(Override), 多型(Polymorphism)

此題為面試筆試時的常考題,也是基本題。


多載 Overload

多載(Overload)指在一個類別(class)中,定義多個名稱相同,但參數(Parameter)不同的方法(Method)。

例如Java StringindexOf(...)即為多載的例子。

indexOf為名稱的方法分別為:

所以只要方法的參數型態或數目不同,則允許多個相同名稱的方法存在。但要注意多載並不包含回傳型態不同,也就是如果方法的名稱相同,參數型態及數目相同,而只有回傳型態不同,仍有命名衝突的錯誤。例如下面範例的public String hello()即與public void hello()發生命名衝突。

public interface HelloWorld {

    void hello(); // 與最下面的 String hello() 衝突

    void hello(int i);

    void hello(int i, int j) ;

    void hello(int i, String s);

    void hello(String s) ;

    String hello();  // 回傳型態不同並無多載,與最上面的 void hello() 衝突

}

而多載(Overload)最常和覆寫(Override)或多型(Polymorphism)一起考,因為多載和覆寫的英文很相近,而多載和多型的中文很相近,非常容易搞混。


覆寫 Override

覆寫(Override)是指子類別可以覆寫父類別的方法內容,使該方法擁有不同於父類別的行為。


多型 Polymorphism

多型(Polymorphism)是指父類別可透過子類別衍伸成多種型態,而父類別為子類別的通用型態,再透過子類別可覆寫父類別的方法來達到多型的效果,也就是同樣的方法名稱會有多種行為。

public class Main {

    public static void main(String[] args) {
        // Animal為Dog及Bird的通用型態
        Animal dog = new Dog();   // 子類別Dog物件分派至Animal型別變數dog
        Animal bird = new Bird(); // 子類別Bird物件分派至Animal型別變數bird
        act(dog);  // run
        act(bird); // fly
    }

    private static void act(Animal animal) { // 因為多型,所以參數以通用的父類別傳入
        animal.move(); // 因為多型及覆寫,所以實際執行的方法為子類別的方法內容
    }

}

class Animal {
    public void move() {
        System.out.println("move");
    }
}

class Dog extends Animal {
    @Override
    public void move() {
        System.out.println("run"); // 覆寫父類別Animal.move()的內容
    }
}

class Bird extends Animal {
    @Override
    public void move() {
        System.out.println("fly"); // 覆寫父類別Animal.move()的內容
    }
}

例如上例中DogBird繼承了父類別Animal並覆寫了父類別原來的方法move(),而子類別物件可指派至父類別型別的變數,且在執行move()方法時則是執行子類別所覆寫的內容,以上所描述的特性就是多型。


面試時通常也會問:「物件導向的特性是什麼?」,但這邊僅說明多載及「繼承」衍生出的覆寫及多型特性,不要搞混了。

物件導向的特性為:封裝(Encapsulation)繼承(Inheritance)多型(Polymorphism)


2 則留言: