1. 程式人生 > >Java面向物件——類的繼承

Java面向物件——類的繼承

1.繼承的定義以及基本使用

定義:子類能夠繼承父類的共有屬性和方法;

特點:Java中只支援單繼承,私有方法不能被繼承;

           實現繼承的類被稱為子類(也叫派生類),被繼承的類被稱為父類(也叫基類). 

           Java的繼承通過extends關鍵字實現. 

先寫一個父類Animals類:

定義兩個私有屬性 name和age 然後給出共有的set和get介面  以及一個共有的say()方法;

package m10d28;

public class Animals {

	private String name;
	private int age;
	
	
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	
	public void speak(){
		System.out.println("我是一隻動物,我叫"+this.getName()+",我的年齡是"+this.getAge());
	}
}

再寫一個子類Dog類,通過extends關鍵字 繼承Animal類:

實際上把父類Animal的共有方法get set以及say()方法都繼承了;

package m10d28;

public class Dog extends Animals{

	public static void main(String[] args) {
		Dog dog=new Dog();
		dog.setName("dog");
		dog.setAge(2);
		dog.speak();
	}
}

輸出結果:

我是一隻動物,我叫dog,我的年齡是2

 2,方法重寫

定義:所謂方法的重寫 我們可以在子類中根據實際要求把父類的方法重寫;

package m10d28;

public class Cat extends Animals{
	
	public void speak(){
		System.out.println("我是一隻貓,我重寫了父類的方法,我叫"+this.getName()+",我的年齡是"+this.getAge());
	}

	public static void main(String[] args) {
		Cat dog=new Cat();
		dog.setName("Cat");
		dog.setAge(2);
		dog.speak();
	}
}

注意:重寫的方法裡面的this.getName()和this.getAge()不能更改為this.name和this.age,

           因為Cat物件裡繼承不到父類的私有欄位;

輸出結果:

我是一隻貓,我重寫了父類的方法,我叫Cat,我的年齡是2

3,物件例項過程以及super關鍵字

物件例項化 先例項化呼叫父類構造方法,再呼叫子類例項化構造方法;

super關鍵主要是呼叫父類方法或者屬性;

我們先來看看父類和子類的構造方法是如何呼叫的,順序是怎樣的:

我們先在父類Animals中新增父類無參構造方法和父類有參構造方法:

        //新增無參構造方法
	public Animals(){
		System.out.println("父類無參構造方法!");
	}
	
	//新增有參構造方法
	public Animals(String name, int age) {
		System.out.println("父類有參構造方法!");
		this.name = name;
		this.age = age;
	}

在子類Cat中新增子類無參構造方法: 

public Cat(){
		System.out.println("子類無參構造方法!");
	}

輸出結果為:

父類無參構造方法!
子類無參構造方法!
我是一隻貓,我重寫了父類的方法,我叫Cat,我的年齡是2

程式是先呼叫父類的無參構造方法,再呼叫子類的無參構造方法! 

super關鍵字的引用:

現在再來看看,如果在子類中用構造方法進行例項化的時候,在子類有參構造方法中

運用this.name或者this.getName()來呼叫父類私有屬性會怎樣?

由上圖可知,如果直接在子類有參構造方法中運用this.name或者this.getName()等都是會報錯的!

因為name和age在父類中都是private型別的,子類是沒有訪問許可權的! 

那麼,如何在子類有參構造方法中呼叫父類的屬性和方法呢?

這時,super()關鍵字就可以派上用場了;前面說過:

super關鍵主要是呼叫父類方法或者屬性;

在Cat子類中新增有參構造方法,並且例項化:

package m10d28;

public class Cat extends Animals{
	
	public void speak(){
		System.out.println("我是一隻貓,我重寫了父類的方法,我叫"+this.getName()+",我的年齡是"+this.getAge());
	}

	public Cat(){
		System.out.println("子類無參構造方法!");
	}
	
	public Cat(String name,int age){
		super(name,age);
		System.out.println("子類有參構造方法!");
	}
	public static void main(String[] args) {
		Cat dog=new Cat("Cat",3);
		dog.speak();
	}
}

 輸出結果:

父類有參構造方法!
子類有參構造方法!
我是一隻貓,我重寫了父類的方法,我叫Cat,我的年齡是3

這是由子類有參構造方法進行例項化的,而且用super關鍵字就可以呼叫父類私有屬性和方法! 

當然,可能有人會想,我直接呼叫父類有參構造方法不就行了;

但是偶爾子類也有自己獨特的屬性,這時也需要父類的屬性一起:

package m10d28;

public class Cat extends Animals{
	
	

	public Cat(){
		System.out.println("子類無參構造方法!");
	}
	//給Cat新增一個獨特的屬性sex
	private String sex;
	
	public String getSex() {
		return sex;
	}

	public void setSex(String sex) {
		this.sex = sex;
	}

	public Cat(String name,int age,String sex){
		super(name,age);
		this.sex=sex;
		System.out.println("子類有參構造方法!");
	}
	
	public void speak(){
		System.out.println("我是一隻貓,我重寫了父類的方法,我叫"+this.getName()+
				",我的年齡是"+this.getAge()+",我的性別是"+this.sex);
	}
	
	public static void main(String[] args) {
		Cat dog=new Cat("Cat",5,"雌性");
		dog.speak();
	}
}

 輸出結果:

父類有參構造方法!
子類有參構造方法!
我是一隻貓,我重寫了父類的方法,我叫Cat,我的年齡是5,我的性別是雌性