1. 程式人生 > >java中子類覆蓋父類方法所必須滿足的條件

java中子類覆蓋父類方法所必須滿足的條件

一、描述

 子類重寫(覆蓋)父類的方法必須滿足的條件:
 1.父類中的方法在子類中必須可見,即子類繼承了父類中的該方法(可以顯式的使用super關鍵字來訪問父類中的被重寫的方法), 如果父類中的方法為private型別的,那麼子類則無法繼承,也無法覆蓋。
 2.子類和父類的方法必須是例項方法,如果父類是static方法而子類是例項方法,或者相反都會報錯。 如果父類和子類都是static方法,那麼子類隱藏父類的方法,而不是重寫父類方法。
 3.子類和父類的方法必須要具有相同的函式名稱、引數列表,並且子類的返回值與父類相同或者是父類返回型別的子型別(jdk1.5之後)。 如果方法名稱相同而引數列表不同(返回型別可以相同也可以不同),那麼只是方法的過載,而非重寫。 如果方法名稱和引數列表相同,返回值型別不同,子類返回值型別也不是父類返回值型別的子類,編譯器就會報錯。 

4.子類方法的訪問許可權不能小於父類方法的訪問許可權(可以具有相同的訪問許可權或者子類的訪問許可權大於父類)。 訪問許可權由高到低:public、protected、包訪問許可權、private。如果子類方法的訪問許可權低於父類,則編譯器會給出錯誤資訊
 5.子類方法不能比父類方法丟擲更多的編譯時異常(不是執行時異常),即子類方法丟擲的編譯時異常或者和父類相同或者是父類異常的子類。

二、原始碼

package tong.yue.day4_264;

import java.io.FileNotFoundException;
import java.io.IOException;

import javax.swing.JButton;
import javax.swing.JComponent;
/**
 * 子類重寫(覆蓋)父類的方法必須滿足的條件:
 * 1.父類中的方法在子類中必須可見,即子類繼承了父類中的該方法(可以顯式的使用super關鍵字來訪問父類中的被重寫的方法),
 * 如果父類中的方法為private型別的,那麼子類則無法繼承,也無法覆蓋。
 * 2.子類和父類的方法必須是例項方法,如果父類是static方法而子類是例項方法,或者相反都會報錯。
 * 如果父類和子類都是static方法,那麼子類隱藏父類的方法,而不是重寫父類方法。
 * 3.子類和父類的方法必須要具有相同的函式名稱、引數列表,並且子類的返回值與父類相同或者是父類返回型別的子型別(jdk1.5之後)。
 * 如果方法名稱相同而引數列表不同(返回型別可以相同也可以不同),那麼只是方法的過載,而非重寫。
 * 如果方法名稱和引數列表相同,返回值型別不同,子類返回值型別也不是父類返回值型別的子類,編譯器就會報錯。
 * 4.子類方法的訪問許可權不能小於父類方法的訪問許可權(可以具有相同的訪問許可權或者子類的訪問許可權大於父類)
 * 訪問許可權由高到低:public、protected、包訪問許可權、private。如果子類方法的訪問許可權低於父類,則編譯器會給出錯誤資訊
 * 5.子類方法不能比父類方法丟擲更多的編譯時異常(不是執行時異常),即子類方法丟擲的編譯時異常或者和父類相同或者是父類異常的子類。
 * @author tong
 *
 */

public class Inheritance {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub

	}

}

class Pareant {
	public void doSomething() {

	}

	public static void doSomething1() {

	}

	public JComponent doSomething2() {
		return null;
	}

	public JComponent doSomething3() {
		return null;
	}

	public void doSomething4(int x) {

	}
	public void doSomething5() throws FileNotFoundException{

	}
	
	private void doSomething6(int x) {

	}
}

class Sub extends Pareant {
	
	//父類中該方法是私有的,對子類不可見,所以子類無法繼承和覆蓋父類的私有方法
	//在這裡並沒有覆蓋父類的私有方法,而是在子類中建立了一個新的和父類同名的方法而已,這兩個方法沒有任何關係
	private void doSomething6(int x) {

	}
	
	// 報錯,父類為例項方法,子類為靜態方法
	//This static method cannot hide the instance method from Pareant
	public static void doSomething() {

	}

	// 報錯,父類為靜態方法,子類為例項方法
	//This static method cannot hide the instance method from Pareant
	public void doSomething1() {

	}

	// 正確,父類的返回值為JComponent,是子類返回值類的父類,從jdk1.5開始,重寫父類方法時的返回值可以與父類相同,也可以是父類的子類
	public JButton doSomething2() {
		return null;
	}

	// 報錯,父類的返回值為JComponent,子類返回值型別為int,子類返回值與父類返回值型別不同,也不是父類返回值的子類
	//The return type is incompatible with Pareant.doSomething3()
	public int doSomething3() {
		return 1;
	}
	
	//報錯,父類的訪問許可權為public,子類為protected,子類的訪問許可權不能低於父類,可以高於或者等於父類的訪問許可權
	//Cannot reduce the visibility of the inherited method from Pareant
	protected void doSomething4(int x) {

	}
	//報錯,子類不能丟擲比父類更多的異常,父類丟擲FileNotFoundException異常,子類丟擲的IOException是父類異常的父類
	//子類只能丟擲和父類一樣的異常,或者是父類異常的子類,而不能超過父類
	//Exception IOException is not compatible with throws clause in Pareant.doSomething5()
	public void doSomething5() throws IOException{

	}
	
}