Java重載和重寫的區別--源碼實例

// 對overload測試的文件:OverloadTest.java


public class OverloadTest {


// 下面幾個方法用來驗證可以通過定義不同的參數類型和參數的數目進行方法重載。


public void fun(){


System.out.println("method fun in OverloadTest, no parameter");


}

public void fun(float f) {


System.out.println("method fun in OverloadTest, parameter type: float");


}


public void fun(int i){


System.out.println("method fun in OverloadTest, parameter type: int");


}

public void fun(int i1, int i2) {


System.out.println("method fun in OverloadTest, parameter type: int, int");


}

// 下面的兩個方法用來驗證可以通過定義不同的參數順序進行方法重載。


// 需要注意:這裏的參數肯定不是相同的類型,否則的順序的先後就毫無意義。


public void fun1(int i, float f) {


System.out.println("method fun1 in OverloadTest, sequence of parameters is: int, float");


}

public void fun1(float f, int i) {


System.out.println("method fun1 in OverloadTest, sequence of parameters is: float, int");


}

// 下面的兩個方法用來驗證方法拋出的異常對於重載的影響.


// 無論是異常的類型還是異常的個數都不會對重載造成任何的影響。


public void fun2() throws TestException {


System.out.println("fun2 in OverloadTest, exception: TestException");


}

public void fun2(int i) throws TestException, TestException1 {


System.out.println("fun2 in OverloadTest, exception: TestException, TestException1");


}

public void fun2(float f) throws Exception {


System.out.println("fun2 in OverloadTest, exception: Exception");


}

// 不能通過拋出的異常類型來重載fun方法。


//public void fun(int i) throws Exception {


// System.out.println("method fun in OverloadTest, parameter type: int, exception: Exception");


//}

// ? 不能通過返回值重載fun方法。


//public boolean fun(int i) throws Exception {


// System.out.println("method fun in OverloadTest, parameter type: int, exception: Exception, return: boolean");


// return true;


//}


private void fun3() { }

// 不能通過不同的訪問權限進行重載


public void fun3() { }


public static void main(String[] args) {


// 這裏只是定義了OverloadTest的實例,所以test不會調用


// OverloadTest1中的方法。


OverloadTest test = new OverloadTest1();


// 這裏定義了OverloadTest1的實例,因爲OverloadTest1是OverloadTest


// 的子類,所以test1會調用OverloadTest中的方法。


OverloadTest1 test1 = new OverloadTest1();




try {


int i = 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(Exception e) { }


}


}

class OverloadTest1 extends OverloadTest{


// 在子類中重載fun


public void fun(int i, int m, int n) {


System.out.println("Overload fun1 in OverloadTest1, parameter type: int, int, int");


}

// 這個不是對父類中方法的重載,只是一個新的方法。


public void fun3(int i) {


System.out.println("fun2 in OverloadTest1");


}


}

// 對override測試的文件:OverrideTest.java


public class OverrideTest {


public void fun() throws TestException {


System.out.println("method fun in OverrideTest");


}

private void fun1() {


System.out.println("method fun1 in OverrideTest");


}




public static void main(String[] args) {


OverrideTest test = new OverrideTest1();


try {


test.fun();


test.fun1();


} catch(Exception e) { }

}

}

class OverrideTest1 extends OverrideTest{


// 以下正常Override


public void fun() throws TestException2 {


System.out.println("fun in OverrideTest1");


}

// 不能Override父類中的方法,因爲它定義了不同的異常類型和


// 返回值。


//public int fun() throws TestException1 {


// System.out.println("method fun in Test");


// return 1;


//}




// 不能Override父類中的方法,因爲它拋出了比父類中非法範圍


// 更大的異常。


//public void fun() throws Exception {


// System.out.println("fun in OverrideTest1");


//}




// 這個方法並沒有Override父類中的fun1方法,因爲這個方法在


// 父類是private類型,所以這裏只是相當於定義了一個新方法。


public void fun1() {


System.out.println("method fun1 in Test");


}


}




class TestException extends Exception{


public TestException(String msg) {


super(msg);


}


}




class TestException1 extends TestException {


public TestException1(String msg) {


super(msg);


}


}

class TestException2 extends TestException {


public TestException2(String msg) {


super(msg);


}


}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章