Java中的重載(overloading)和重寫(xiě)(overriding)都涉及到方法的多態(tài)性,但它們?cè)趯?shí)現(xiàn)方式和目的上有所不同。
重載是指在同一個(gè)類中定義多個(gè)具有相同名稱但參數(shù)類型或數(shù)量不同的方法。這些方法可以擁有不同的返回值類型,但不能僅僅通過(guò)返回類型來(lái)區(qū)分方法重載。當(dāng)調(diào)用方法時(shí),編譯器會(huì)根據(jù)傳入的參數(shù)類型、數(shù)量和順序來(lái)確定調(diào)用哪個(gè)方法。因此,重載方法的特點(diǎn)是方法名相同,但參數(shù)列表不同。
例如,下面的代碼演示了一個(gè)添加兩個(gè)數(shù)的方法add,其中有三個(gè)版本的重載方法,每個(gè)版本接受不同的參數(shù)類型:
pubpc class Calculator {
pubpc int add(int x, int y) {
return x + y;
}
pubpc double add(double x, double y) {
return x + y;
}
pubpc String add(String x, String y) {
return x + " " + y;
}
}
重寫(xiě)是指子類重新定義其父類中已有的方法,以便更改或擴(kuò)展其行為。重寫(xiě)方法必須與父類方法具有相同的方法名,參數(shù)列表和返回類型,但可以有不同的實(shí)現(xiàn)。重寫(xiě)方法通常用于實(shí)現(xiàn)多態(tài)性,當(dāng)調(diào)用該方法時(shí),實(shí)際上執(zhí)行的是子類中的方法,而不是父類中的方法。
例如,下面的代碼演示了一個(gè)Animal類以及兩個(gè)子類Dog和Cat,其中Dog和Cat都重寫(xiě)了父類的speak()方法:
pubpc class Animal {
pubpc void speak() {
System.out.println("I am an animal");
}
}
pubpc class Dog extends Animal {
@Override
pubpc void speak() {
System.out.println("Woof!");
}
}
pubpc class Cat extends Animal {
@Override
pubpc void speak() {
System.out.println("Meow!");
}
}
當(dāng)創(chuàng)建一個(gè)Dog或Cat對(duì)象并調(diào)用speak()方法時(shí),實(shí)際上執(zhí)行的是子類中的方法,而不是父類中的方法。
總的來(lái)說(shuō),重載和重寫(xiě)都涉及到方法的多態(tài)性,但它們的實(shí)現(xiàn)方式和目的有所不同。重載方法通過(guò)方法名和參數(shù)列表來(lái)確定具體調(diào)用哪個(gè)方法,而重寫(xiě)方法則是在子類中重新定義其父類中已有的方法以實(shí)現(xiàn)多態(tài)性。