在Java中,有兩種方式可以實(shí)現(xiàn)方法的重新定義,分別是重寫和覆蓋。
重寫(overriding)是指在子類中定義了一個(gè)與父類中具有相同名稱、參數(shù)列表和返回類型的方法,這個(gè)方法將覆蓋父類中的同名方法,使得在調(diào)用該方法時(shí)實(shí)際執(zhí)行的是子類的方法。
public class Animal { public void move() { System.out.println("Animal can move"); } } public class Dog extends Animal { public void move() { System.out.println("Dog can move"); } }
以上代碼中,Dog類重寫了Animal類的move()方法。當(dāng)我們調(diào)用Dog類的move()方法時(shí),實(shí)際執(zhí)行的是Dog類中的方法,輸出“Dog can move”。
覆蓋(overloading)是指在同一個(gè)類中定義多個(gè)方法,這些方法具有相同名稱但參數(shù)列表不同的特點(diǎn)。Java在調(diào)用這些方法時(shí)會根據(jù)傳遞的參數(shù)自動選擇最匹配的方法進(jìn)行執(zhí)行。即使是父類的同名方法和子類的方法也并不會相互干擾。
public class Calculation { public int add(int x, int y) { return x + y; } public double add(double x, double y) { return x + y; } } public class Main { public static void main(String[] args) { Calculation cal = new Calculation(); System.out.println(cal.add(1, 2)); // 輸出3 System.out.println(cal.add(1.5, 2.5)); // 輸出4.0 } }
以上代碼中,Calculation類定義了兩個(gè)add()方法,一個(gè)接收兩個(gè)整型參數(shù),一個(gè)接收兩個(gè)double類型參數(shù)。在調(diào)用這些方法時(shí),根據(jù)傳遞的參數(shù)類型自動匹配最匹配的方法進(jìn)行執(zhí)行。
總體來說,重寫是針對繼承的,父類和子類之間的方法名相同,方法的返回類型和參數(shù)也相同,但是方法的實(shí)現(xiàn)不同;而覆蓋是針對方法重載的,同一個(gè)類中方法名相同,但參數(shù)列表不同,針對不同的參數(shù)列表,執(zhí)行不同的方法。