1. 程式人生 > >方法重寫和方法重載的區別?

方法重寫和方法重載的區別?

方法重載 繼承關系 通過 而是 調用方法 返回值 新的 內容 per

**方法重載:overload
一個類中你有了一個方法A,在這個類中你又寫了一個方法B,
方法A和方法B的方法名一樣,但參數不同,返回值類型不同,與返回值無關,此時方
法B重載了方法A;
參數不同體現在:
(1): 參數類型不同;
(2): 參數個數不同;
(3): 參數順序不同;
例如:
public class TestClass{
方法A:
public int add (int a,int b){
return a+b;
}
方法B:
public int add (float a){
return a+b;
}
}
此時方法B重載了方法A.

            **  方法重寫override:
                一個類TestClass2繼承了另一個類TestClass1,TestClass1類中有一個方法A,此時TestClass2寫了一個方法B,方法B 和方法A 的

名字,返回值類型以及參數全部一樣,此時方法B重寫了方法A;
如何定義重寫:在Java程序中,類的繼承關系可以產生一個子類,子類繼承父類,它具備了父類所有的特征,繼承了父類所有的方法和變量。子類可以定義新的特征,當子類需要修改父類的一些方法進行擴展,增大功能,程序設計者常常把這樣的一種操作方法稱為重寫,也叫稱為覆寫或覆蓋。重寫體現了Java優越
性,重寫是建立在繼承關系上,它使語言結構更加豐富。在Java中的繼承中,子類既可以隱藏和訪問父類的方法,也可以覆蓋繼承父類的方法。在Java中覆蓋繼承父類的方法就是通過方法的重寫來實現的。

所謂方法的重寫是指子類中的方法與父類中繼承的方法有完全相同的返回值類型、方法名、參數個數以及參數類型。這樣,就可以實現對父類方法的覆蓋。

方法A:
public class TestClass1{
public int test (int i) {
return 1;
}
}
方法B繼承方法A:
public class TestClass2 extends TestClass1{
public int test(int i){
return 2;
}
}

            然後在main方法中創建子類的對象調用方法test,運行結果是子類的test方法;   

        可以看出,當子類重寫了父類中的print()方法後,使用S調用的是子類的print()方法,父類中的print()方法被覆蓋了。也就是說,如果現在子類將父類中的方法重寫了,調用的時候肯定是調用被重寫過的方法,那麽如果現在一定要調用父類中的方法該怎麽辦呢?此時,通過使用.. super關鍵就可以實現這個功能,super關鍵字可以從子類訪問父類中的內容,如果要訪問被重寫過的方法,使用“super.方法名(參數列表)”的形式調用。

      方法A:

public class TestClass1{
public int test (int i) {
return 1;
}
}
方法B繼承方法A:
public class TestClass2 extends TestClass1{
public int test(int i){
super.test("訪問父類被覆蓋的方法");
return 2;
}
}

     在mian方法中創建子類對象調用test方法,運行結果是
     父類被覆蓋的test方法和子類的test方法;

**方法重寫註意事項

(一) 父類方法的參數列表必須完全與被子類重寫的方法的參數列表相同,否則不能稱其為重寫而是重載。
(二) 父類的返回類型必須與被子類重寫的方法返回類型相同,否則不能稱其為重寫而是重載。
(三) Java中規定,被子類重寫的方法不能擁有比父類方法更加嚴格的訪問權限。訪問權限大小關系為:

編寫過Java程序的人就知道,父類中的方法並不是在任何情況下都可以重寫的,當父類中方法的訪問權限修飾符為private時,該方法只能被自己的類訪問,不能被外部的類訪問,在子類是不能被重寫的。如果定義父類的方法為public,在子類定義為private,程序運行時就會報錯。例如:

class Person
{public void print()(//public訪問權限
System.out.println( "父類Person的print方法! ");
}
}
Class Stedent extends Person
{private void print()(//重寫方法降低了訪問權限,錯誤
System.out.println( "子類Student的print方法!" );
}
}
(四) 由於父類的訪問權限修飾符的限制一定要大於被子類重寫方法的訪問權限修飾符,而private權限最小。所以如果某一個方法在父類中的訪問權限是private,那麽就不能在子類中對其進行重寫。如果重新定義,也只是定義了一個新的方法,不會達到重寫的效果。

(五) 在繼承過程中如果父類當中的方法拋出異常,那麽在子類中重寫父類的該方法時,也要拋出異常,而且拋出的異常不能多於父類中拋出的異常(可以等於父類中拋出的異常)。換句話說,重寫方法一定不能拋出新的檢查異常,或者比被重寫方法聲明更加寬泛的檢查型異常。例如,父類的一個方法申明了一個檢查異常IOException,在重寫這個方法時就不能拋出Exception,只能拋出IOException的子類異常,可以拋出非檢查異常。

方法重寫和方法重載的區別?