1. 程式人生 > >繼承extends與 抽象類 abstract

繼承extends與 抽象類 abstract

繼承的父子成員特點

子類繼承父類:

  1:子類可以訪問父類的非私有成員

  2:可以在子類中新增子類特有成員

繼承的作用

 1)繼承可以提供程式碼的複用性:父類中的一個方法,所有的子類的都用

 2)提供了程式的可擴充套件性

1:Java支援單繼承

  a:一個子類只能有一個父類(一個兒子只能有一個爹)

  b:一個父類可以有多個子類(一個爹可以有多個兒子)

  c:任何一個類如果沒有指定父類,則他的父類預設就是Object

 為什麼Java不支援多繼承?

   如果兩個父類中出現一模一樣的方法,則子類如果都繼承過來,在呼叫該方法時,會出現問題



 super關鍵字(重點)

   特點:

1:superthis一樣也是一個引用

,this是存放本類物件的地址,super是存放父類空間的地址

2:super只能訪問到子類的直接父類(親爹)

3:在任何一個類內部,都有一個隱藏的super,指向父類空間

什麼需要使用super?

 1:子類和父類出現了同名的變數,super來區分

 2:子類和父類出現了同名的方法,super來區分

 3:如果子類要呼叫父類的構造方式時,使用super(引數)

父子類構造方法的關係(重點)

  特點:

    1:當然建立子類物件時,系統會預設先呼叫父類的無參構造,如果父類還有父類,則會先行頂層類的構造

 為什麼子類會會呼叫父類的無參構造?

   在子類構造方法的第一行有一個隱藏的super(),會自動呼叫父類的無參構造

  意義:

在建立子類物件時,父類也會被開闢空間,父類的空間也要被初始化,所以在給子類空間初始化之前.必須先給父類的空間初始化,所以必須呼叫父類構造

方法的重寫(重點)

 特點:

   1:子類寫一個和父類一模一樣的方法,這就是方法的重寫

   2:當呼叫重寫後的方法時,執行的是子類的方法,就好像父類的方法被覆蓋一樣

 意義:

   當子類從父類繼承一些方法時,如果父類的方法不能滿足子類需求,則子類需要重寫這些方法

需要注意的問題:

public > protected > 預設許可權 > private

  1:子類在重寫父類方法時,子類方法的訪問許可權必須大於等於父類

  2:如果父類的方法是

private修飾,即使子類寫一個和父類一樣的方法,也不是重寫.因為子類根本就不知道父類有這個方法,談不上重寫

  3:當我們重寫父類的方法時,只要和父類方法寫的一模一樣即可.

抽象方法

   a:這種方法沒有方法體(沒有{})

   b:抽象方法必須使用一個abstract關鍵字來宣告

   c:如果一個類有抽象方法,則該類必須加abstract關鍵字來宣告

2:抽象類

   a:類的前邊有abstract關鍵字

   b:抽象類不能建立物件

   c:抽象類要作為父類

   d:如果一個子類繼承了抽象類,則必須重寫該類中所有的抽象方法,否則該類還是抽象類

   e: 抽象類不能建立物件,但是可以有構造方法,這個構造是給子類準備的.

   f:一個抽象類可以沒有抽象方法,這種類唯一的意義是不讓我們建立該類的物件

 2.2  抽象類的特點

     抽象類不能建立物件,但是可以有構造方法,這個構造是給子類準備的.

 2.3  抽象類的作用

我在設計一個類時,如果該類中的某個方法描述不清楚,該方法應該設為抽象方法,該類設為抽象類





IT公司有多名員工,按照員工負責的工作不同,進行了部門的劃分(研發部員工、維護部員工)。研發部根據所需研發的內容不同,又分為JavaEE工程師、Android工程師;維護部根據所需維護的內容不同,又分為網路維護工程師、硬體維護工程師。

公司的每名員工都有他們自己的員工編號、姓名,並要做它們所負責的工作。

l 工作內容

n JavaEE工程師:員工號為xxx的 xxx員工,正在研發淘寶網站

n Android工程師:員工號為xxx的 xxx員工,正在研發淘寶手機客戶端軟體

網路維護工程師:員工號為xxx的 xxx員工,正在檢查網路是否暢通

硬體維護工程師:員工號為xxx的 xxx員工,正在修復印表機


請根據描述,完成員工體系中所有類的定義,並指定類之間的繼承關係。進行XX工程師類的物件建立,完成工作方法的呼叫。

1.1 案例分析

l 根據上述部門的描述,得出如下的員工體系圖 


l 根據員工資訊的描述,確定每個員工都有員工編號、姓名、要進行工作。則,把這些共同的屬性與功能抽取到父類中(員工類),關於工作的內容由具體的工程師來進行指定。

n 工作內容

u JavaEE工程師:員工號為xxx的 xxx員工,正在研發淘寶網站

u Android工程師:員工號為xxx的 xxx員工,正在研發淘寶手機客戶端軟體

網路維護工程師:員工號為xxx的 xxx員工,正在檢查網路是否暢通

硬體維護工程師:員工號為xxx的 xxx員工,正在修復印表機

建立JavaEE工程師物件,完成工作方法的呼叫

員工類:

package Employee;

public abstract class Employee {

	private String id;
	private String name;
	public abstract void work();
	
	public Employee() {
		super();//訪問父類物件的空參方法
	}
	
	public Employee(String id, String name) {
		super();
		this.id = id;
		this.name = name;
	}
	public String getId() {
		return id;
	}
	public void setId(String id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	
	
	
}

研發部員工類:

package Employee;

public abstract class Developer extends Employee {

	public Developer() {
		super();
		// TODO Auto-generated constructor stub
	}

	public Developer(String id, String name) {
		super(id, name);
		// TODO Auto-generated constructor stub
	}
	
	
	

}

維護部員工類:

package Employee;

public abstract class Maintainer extends Employee {

	public Maintainer() {
		super();
		// TODO Auto-generated constructor stub
	}

	public Maintainer(String id, String name) {
		super(id, name);
		// TODO Auto-generated constructor stub
	}
	


}

javaEE

package Employee;

public class JavaEE extends Developer {
	
	

	@Override
	public void work() {
		System.out.println("員工號為"+getId()+"的 "+getName()+"員工,正在研發淘寶網站");

	}

	public JavaEE() {
		super();
		// TODO Auto-generated constructor stub
	}
	public JavaEE(String id, String name){
		super(id,name);
	}



}

Android:

package Employee;

public class Android extends Developer {

	@Override
	public void work() {
		System.out.println("員工號為"+getId()+"的 "+getName()+"員工,正在研發淘寶手機客戶端軟體");

	}

	public Android() {
		super();
		// TODO Auto-generated constructor stub
	}
	public Android(String id,String name){
		super(id,name);
	}

}

硬體維護:

package Employee;

public class Hardware extends Maintainer {

	@Override
	public void work() {
		System.out.println("員工號為"+getId()+"的 "+getName()+"員工,正在修復印表機");

	}

	public Hardware() {
		super();
		// TODO Auto-generated constructor stub
	}
	public Hardware(String id,String name){
		super(id,name);
	}

}

軟體維護:

package Employee;

public class Network extends Maintainer {

	@Override
	public void work() {
		System.out.println("員工號為"+getId()+"的 "+getName()+"員工,正在檢查網路是否暢通");

	}

	public Network() {
		super();
		// TODO Auto-generated constructor stub
	}
	
	public Network(String id,String name){
		super(id,name);
	}
}

測試類:

package Employee;

public class Test {

	public static void main(String[] args) {
		JavaEE javaEE = new JavaEE();
		javaEE.setId("t001");
		javaEE.setName("小強");
		javaEE.work();
		
		JavaEE javaEE2 = new JavaEE("t002","小明");
		javaEE2.work();

	}

}