天天看點

Java面向對象之Java的重載和重寫

重載的定義是:在一個類中,如果出現了兩個或者兩個以上的同名函數,隻要它們的參數的個數,或者參數的類型不同,即可稱之為該函數重載了。

如何區分重載:當函數同名時,隻看參數清單。和傳回值類型沒關系。

(1) 構造器的重載

構造器的重載;形參清單不同。

public class Person {
	String name;
	int age;
	//構造器的重載:形參清單不同	
	public Person(){
		System.out.println("無參構造方法");
		this.age=20;
		this.name="小明";
	}
	public Person(int age){
		this.age=age;
		this.name="小明";
		System.out.println("有參構造方法1");
	}
	public Person(int age,String name){
		this(age);//調用另外一個構造方法
		this.name=name;
		System.out.println("有參構造方法2");
	}
           

調用構造器:

public static void main(String[] args) {
		Person person=new Person();
		person=new Person(10, "小明");			
	}
           

效果截圖:

(2)方法的重載(Overload)

重載(overloading) 是在一個類裡面,方法名字相同,而參數不同。傳回類型可以相同,也可以不同。每個重載的方法(或者構造函數)都必須有一個獨一無二的參數類型清單。最常用的地方就是構造器的重載。

重載規則: 被重載的方法必須形參清單不一樣(參數個數或類型不一樣);被重載的方法可以改變傳回類型; 被重載的方法可以改變通路修飾符;被重載的方法可以聲明新的或更廣的檢查異常;方法能夠在同一個類中或者在一個子類中被重載。傳回值類型不能作為重載函數的區分标準。

public void say(String text){
		System.out.println(this.age +"歲的"+this.name+"說:\""+text+"\"");
	}	
    public String say(String text,String state) {
		return this.age +"歲的"+this.name+state+"的說:\""+text+"\"";
	}
	String say(String text,String state,String location){
		return this.age +"歲的"+this.name+"在"+location+""+state+"的說:\""+text+"\"";
	}
           

調用方法:

public static void main(String[] args) {
		Person person=new Person();
		person.say("我要學Java");
		System.out.println(person.say("我要學Java","興奮"));
		System.out.println(person.say("我要學Java","興奮","教室"));		
	}
           

效果截圖:

Java面向對象之Java的重載和重寫

(3)方法的重寫(Override)

重寫是子類對父類的允許通路的方法的實作過程進行重新編寫, 傳回值和形參都不能改變。重寫的好處在于子類可以根據需要,定義特定于自己的行為。也就是說子類能夠根據需要實作父類的方法。重寫方法不能抛出新的檢查異常或者比被重寫方法申明更加寬泛的異常。例如:父類的一個方法申明了一個檢查異常 IOException,但是在重寫這個方法的時候不能抛出 Exception 異常,因為 Exception 是 IOException 的父類,隻能抛出 IOException 的子類異常。

方法的重寫規則:參數清單必須完全與被重寫方法的相同;傳回類型必須完全與被重寫方法的傳回類型相同; 通路權限不能比父類中被重寫的方法的通路權限更低。例如:如果父類的一個方法被聲明為public,那麼在子類中重寫該方法就不能聲明為protected。 父類的成員方法隻能被它的子類重寫。聲明為final的方法不能被重寫。聲明為static的方法不能被重寫,但是能夠被再次聲明。子類和父類在同一個包中,那麼子類可以重寫父類所有除了聲明為private和final 的方法。子類和父類不在同一個包中,那麼子類隻能夠重寫父類的聲明為public和 protected的非final方法。重寫的方法能夠抛出任何非強制異常,無論被重寫的方法是否抛出異常。但是,重寫的方法不能抛出新的強制性異常,或者比被重寫方法聲明的更廣泛的強制性異常,反之則可以。構造方法不能被重寫。如果不能繼承一個方法,則不能重寫這個方法。

示例代碼:

public class Bird {	
	public Bird(){
		System.out.println("Bird 構造器");
	}
	public void fly(){
		System.out.println("我是鳥,我可以飛!");
	}	
	public void eatting(){
		System.out.println("....吃.....");
	}
}
           

子類繼承父類,重寫父類的方法;

public class Ostrch extends Bird {
	// 重寫fly方法
	public void fly() {
		System.out.println("雖然我是鳥,但是我不能飛!");
	}
}
           

調用運作:

public class Demo3 {
	public static void main(String[] args) {		
		Ostrch ostrch=new Ostrch();
		ostrch.fly();
		ostrch.eatting();	
	}
}
           

效果截圖:

Java面向對象之Java的重載和重寫

重寫與重載之間的差別

Java面向對象之Java的重載和重寫

方法重載是一個類中定義了多個方法名相同,而他們的參數的數量不同或數量相同 而類型和次序不同,則稱為方法的重載(Overloading)。

方法重寫是在子類存在方法與父類的方法的名字相同,而且參數的個數與類型一樣,傳回值也一樣的方法,就稱為重寫(Overriding)。

方法重載是一個類的多态性表現,而方法重寫是子類與父類的一種多态性表現。