重載(overload)
-
在同一個類中,方法名相同,參數列表不同(參數個數,參數順序,參數類型)
-
僅僅返回類型不同不足以稱爲方法的重載(重載與方法返回類型無關)
-
僅僅參數變量名稱不同是不可以的
public class OverloadDemo {
/**
* 方法的重載 overload
*
* 方法名相同,參數列表不同(參數個數不同,參數類型不同,參數順序不同)
* 注意:與方法返回類型無關,與修飾符無關
*/
public int sum(int a, int b){
return a + b;
}
// 方法名相同,參數類型不同,構成重載,與返回值類型無關
public float sum(float a, float b){
return (int)(a + b);
}
// 方法名相同,參數數量不同,構成重載,與返回值類型無關
public int sum(int a, int b, int c){
return a + b + c;
}
public void print(String str, int year){
System.out.println("先是String,後是Integer");
}
// 方法名相同,參數順序不同,構成重載,與返回值類型無關
public void print(int year, String str){
System.out.println("先是Integer,後是String");
}
}
重寫(override)
-
子類繼承父類,方法名相同,參數列表相同,權限修飾符作用範圍要大於父類的範圍
-
父類用public修飾的方法被重寫,子類中方法的修飾符只能是public
-
靜態方法不能被重寫
-
final修飾的方法不能被重寫
public class OverrideDemo {
/**
* 方法的重寫 overwrite
*
* 重寫是 方法名相同,返回值相同,參數列表相同(參數個數相同,參數順序相同,參數類型相同)
* 方法的內容不同(方法內部的代碼不同,也可以相同)
*/
class Father{
public void run(){
System.out.println("Father run");
}
public void eat(){
System.out.println("Father eat");
}
}
class Son extends Father{
// 子類Son繼承Father,返回類型、參數列表、方法名都和父類相同,重寫了方法run()
public void run(){
System.out.println("Son run");
}
// 子類Son繼承Father,返回類型、參數列表、方法名都和父類相同,重寫了方法eat()
public void eat(){
System.out.println("Son eat");
}
}
}
總結
重寫和重載不同點:
- 重寫發生必須要有繼承關係;重載在同一類中發生。
- 重寫要求子類方法返回類型、方法名、參數列表與父類中方法相同;重寫要求方法名、參數列表不同,與返回值無關。
重寫和重載相同點:
- 都要求方法名通相同