重載:
要求:兩同一不同
兩同:發生在同一個類中,方法名相同;
一不同:形參列表不同;
方法返回值類型、訪問修飾符,與重載無關;
例如:
public class Overload {
public void test(){
System.out.println("無參數");
}
public void test(String str){
System.out.println("重載test方法,有參數:" + str);
}
public static void main(String[] args) {
// TODO Auto-generated method stub
Overload ol = new Overload();
ol.test();
ol.test("hello");
}
}
編譯運行上面代碼,運行結果爲:
方法返回值類型與重載無關的原因是:
對於int test()與void test() 兩個方法,如果調用int result = test();,系統可以識別是調用返回值類型爲int的方法,但java調用方法時可以忽略方法的返回值,如果直接調用test();,系統無法判斷是調用哪個方法。
重寫:
要求:發生在父子類中,兩同兩小一大
兩同:方法名相同,形參列表相同;
兩小:子類方法返回值類型應比父類方法返回值類型更小或相等,子類方法聲明拋出的異常類應比父類方法聲明拋出的異常類更小或相等;
一大:子類的方法的訪問權限應比父類的方法的訪問權限更大或相等(當父類方法具有private訪問權限時,子類無法訪問父類方法);
例如:
public class Bird {
public void fly(){
System.out.println("我能飛...");
}
}
public class Ostrich extends Bird{
public void fly(){
System.out.println("我能跑...");
}
public static void main(String[] args) {
// TODO Auto-generated method stub
Ostrich os = new Ostrich();
os.fly();
}
}
編譯運行上面代碼,運行結果爲:
當子類重寫父類的方法後,子類的對象將無法訪問父類被重寫的方法,但可以在子類方法中使用super(實例方法)或者父類的類名作爲調用者來調用父類中被重寫的方法。
public class Ostrich extends Bird{
public void fly(){
super.fly();
System.out.println("我能跑...");
}
public static void main(String[] args) {
// TODO Auto-generated method stub
Bird b = new Bird();
b.fly();
Ostrich os = new Ostrich();
os.fly();
}
}
編譯運行上面代碼,運行結果爲: