override

override

override可以翻譯為覆蓋,從字面就可以知道,它是覆蓋了一個方法並且對其重寫,以求達到不同的作用。對其來說最熟悉的覆蓋就是對介面方法的實現,在介面中一般只是對方法進行了聲明,在實現時,就需要實現介面聲明的所有方法。除了這個典型的用法以外,繼承中也可能會在子類覆蓋父類中的方法。

注意事項


覆蓋

在覆蓋要注意以下的幾點:
1、覆蓋的方法的標誌必須要和被覆蓋的方法的標誌完全匹配,才能達到覆蓋的效果;
2、覆蓋的方法的返回值必須和被覆蓋的方法的返回一致;
3、覆蓋的方法所拋出的異常必須和被覆蓋方法的所拋出的異常一致,或者是其子類;
4、被覆蓋的方法不能為private,否則在其子類中只是新定義了一個方法,並沒有對其進行覆蓋。
overload可能比較熟悉,可以翻譯為重載,它是指可以定義一些名稱相同的方法,通過定義不同的輸入參數來區分這些方法,然後再調用時,VM就會根據不同的參數樣式,來選擇合適的方法執行。

重載

使用重載要注意以下的幾點
1、在使用重載時只能通過不同的參數樣式。例如,不同的參數類型,不同的參數個數,不同的參數順序(同一方法內,參數類型參數類型不同的情況下才考慮參數順序。比如fun(int a,int b)和fun(int b,int a)則是同樣的方法,不能算作重載);
2、不能通過訪問許可權、返回類型、拋出的異常進行重載;
3、方法的異常類型和數目不會對重載造成影響;
4、對於繼承來說,如果某一方法在父類中是訪問許可權是priavte,那麼就不能在子類對其進行重載,如果定義的話,也只是定義了一個新方法,而不會達到重載的效果。

測試程序


下面是對override和overload的測試程序,其中註釋中的內容都是會產生編譯錯誤的代碼,將註釋去掉,看看在編譯時會產生什麼效果。
// 對overload測試的文件:OverloadTest.java
public class OverloadTest {

驗證方法


按定義不同的參數類型和參數的數目進行重載
// 下面幾個方法用來驗證可以通過定義不同的參數類型和參數的數目進行方法重載。
public void fun()
{
System.out.println("methodfuninOverloadTest,noparameter");
}
public void fun(float f)
{
System.out.println("methodfuninOverloadTest,parametertype:float");
}
public void fun(int i)
{
System.out.println("methodfuninOverloadTest,parametertype:int");
}
public void fun(int i1,int i2)
{
System.out.println("methodfuninOverloadTest,parametertype:int,int");
}
//下面的兩個方法用來驗證可以
按定義不同的參數順序進行方法重載
//需要注意:這裡的參數肯定不是相同的類型,否則的順序的先後就毫無意義。
public void fun1(int i,float f)
{
System.out.println("methodfun1inOverloadTest,sequenceofparametersis:int,float");
}
public void fun1(float f,int i)
{
System.out.println("methodfun1inOverloadTest,sequenceofparametersis:float,int");
}
//下面的兩個方法用來驗證方法拋出的異常對於重載的影響.
//無論是異常的類型還是異常的個數都不會對重載造成任何的影響。
public void fun2()throwsTestException
{
System.out.println("fun2inOverloadTest,exception:TestException");
}
public void fun2(int i)throwsTestException,TestException1
{
System.out.println("fun2inOverloadTest,exception:TestException,TestException1");
}
public void fun2(floatf)throwsException
{
System.out.println("fun2inOverloadTest,exception:Exception");
}
//不能通過拋出的異常類型來重載fun方法。
//publicvoidfun(inti)throwsException{
//System.out.println("methodfuninOverloadTest,parametertype:int,exception:Exception");
//}
//不能通過返回值重載fun方法。
//publicbooleanfun(inti)throwsException{
//System.out.println("methodfuninOverloadTest,parametertype:int,exception:Exception,return:boolean");
//returntrue;
//}
privatevoidfun3(){}
//不能通過不同的訪問許可權進行重載
publicvoidfun3(){}
publicstaticvoidmain(String[]args){
//這裡只是定義了OverloadTest的實例,所以test不會調用
//OverloadTest1中的方法。
OverloadTesttest=newOverloadTest1();
//這裡定義了OverloadTest1的實例,因為OverloadTest1是OverloadTest
//的子類,所以test1會調用OverloadTest中的方法。
OverloadTest1test1=newOverloadTest1();
try{
inti=1,j=2,m=3;
//這裡不會調用OverloadTest1的fun方法
//test.fun(i,m,j);
test1.fun(i,j,m);
test1.fun();
//這個調用不會執行,因為fun3()在OverloadTest中訪問許可權是priavte
//test1.fun3();
test1.fun3(i);
}catch(Exceptione){}
}
}
classOverloadTest1extendsOverloadTest{
//在子類中重載fun
public void fun(inti,intm,intn)
{
System.out.println("Overloadfun1inOverloadTest1,parametertype:int,int,int");
}
//這個不是對父類中方法的重載,只是一個新的方法。
public void fun3(inti)
{
System.out.println("fun2inOverloadTest1");
}
}
//對override測試的文件:OverrideTest.java
public class Override Test
{
publicvoidfun()throwsTestException
{
System.out.println("methodfuninOverrideTest");
}
private void fun1()
{
System.out.println("methodfun1inOverrideTest");
}
public static void main(String[]args)
{
OverrideTest test=new OverrideTest1();
try{
test.fun();
test.fun1();
}catch(Exceptione){}
}
}
class Override Test1extends Override Test
{
//以下正常Override
publicvoidfun()throwsTestException2{
System.out.println("funinOverrideTest1");
}
//不能Override父類中的方法,因為它定義了不同的異常類型和
//publicintfun()throwsTestException1{
//System.out.println("methodfuninTest");
//return1;
//}
//不能Override父類中的方法,因為它拋出了比父類中非法範圍
//更大的異常。
//publicvoidfun()throwsException{
//System.out.println("funinOverrideTest1");
//}
//這個方法並沒有Override父類中的fun1方法,因為這個方法在
//父類是private類型,所以這裡只是相當於定義了一個新方法。
public void fun1()
{
System.out.println("methodfun1inTest");
}
}
classTestExceptionextendsException
{
publicTestException(Stringmsg)
{
super(msg);
}
}
classTestException1extendsTestException
{
publicTestException1(Stringmsg)
{
super(msg);
}
}
classTestException2extendsTestException
{
publicTestException2(Stringmsg)
{
super(msg);
}
}