此題為面試筆試時的常考題,也是基本題。
多載 Overload
多載(Overload)指在一個類別(class)中,定義多個名稱相同,但參數(Parameter)不同的方法(Method)。
例如Java String
的indexOf(...)
即為多載的例子。
以indexOf
為名稱的方法分別為:
public int indexOf(int ch)
public int indexOf(int ch, int fromIndex)
public int indexOf(String str)
public int indexOf(String str, int fromIndex)
所以只要方法的參數型態或數目不同,則允許多個相同名稱的方法存在。但要注意多載並不包含回傳型態不同,也就是如果方法的名稱相同,參數型態及數目相同,而只有回傳型態不同,仍有命名衝突的錯誤。例如下面範例的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()的內容
}
}
例如上例中Dog
及Bird
繼承了父類別Animal
並覆寫了父類別原來的方法move()
,而子類別物件可指派至父類別型別的變數,且在執行move()
方法時則是執行子類別所覆寫的內容,以上所描述的特性就是多型。
面試時通常也會問:「物件導向的特性是什麼?」,但這邊僅說明多載及「繼承」衍生出的覆寫及多型特性,不要搞混了。
物件導向的特性為:封裝(Encapsulation),繼承(Inheritance),多型(Polymorphism)。
謝謝您的分享,寫得好簡明,一看就恍然大悟啊!
回覆刪除感謝簡單明瞭的分享
回覆刪除