繼承extends與 抽象類 abstract
繼承的父子成員特點
子類繼承父類:
1:子類可以訪問父類的非私有成員
2:可以在子類中新增子類特有成員
繼承的作用
1)繼承可以提供程式碼的複用性:父類中的一個方法,所有的子類的都用
2)提供了程式的可擴充套件性
1:Java支援單繼承
a:一個子類只能有一個父類(一個兒子只能有一個爹)
b:一個父類可以有多個子類(一個爹可以有多個兒子)
c:任何一個類如果沒有指定父類,則他的父類預設就是Object
為什麼Java不支援多繼承?
如果兩個父類中出現一模一樣的方法,則子類如果都繼承過來,在呼叫該方法時,會出現問題
super關鍵字(重點)
特點:
1:super和this一樣也是一個引用
2:super只能訪問到子類的直接父類(親爹)
3:在任何一個類內部,都有一個隱藏的super,指向父類空間
什麼需要使用super?
1:子類和父類出現了同名的變數,用super來區分
2:子類和父類出現了同名的方法,用super來區分
3:如果子類要呼叫父類的構造方式時,使用super(引數)
父子類構造方法的關係(重點)
特點:
1:當然建立子類物件時,系統會預設先呼叫父類的無參構造,如果父類還有父類,則會先行頂層類的構造
為什麼子類會會呼叫父類的無參構造?
在子類構造方法的第一行有一個隱藏的super(),會自動呼叫父類的無參構造
意義:
在建立子類物件時,父類也會被開闢空間,父類的空間也要被初始化,所以在給子類空間初始化之前.必須先給父類的空間初始化,所以必須呼叫父類構造
方法的重寫(重點)
特點:
1:子類寫一個和父類一模一樣的方法,這就是方法的重寫
2:當呼叫重寫後的方法時,執行的是子類的方法,就好像父類的方法被覆蓋一樣
意義:
當子類從父類繼承一些方法時,如果父類的方法不能滿足子類需求,則子類需要重寫這些方法
需要注意的問題:
public > protected > 預設許可權 > private
1:子類在重寫父類方法時,子類方法的訪問許可權必須大於等於父類
2:如果父類的方法是
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員工,正在研發淘寶手機客戶端軟體
n 網路維護工程師:員工號為xxx的 xxx員工,正在檢查網路是否暢通
n 硬體維護工程師:員工號為xxx的 xxx員工,正在修復印表機
請根據描述,完成員工體系中所有類的定義,並指定類之間的繼承關係。進行XX工程師類的物件建立,完成工作方法的呼叫。
1.1 案例分析
l 根據上述部門的描述,得出如下的員工體系圖
l 根據員工資訊的描述,確定每個員工都有員工編號、姓名、要進行工作。則,把這些共同的屬性與功能抽取到父類中(員工類),關於工作的內容由具體的工程師來進行指定。
n 工作內容
u JavaEE工程師:員工號為xxx的 xxx員工,正在研發淘寶網站
u Android工程師:員工號為xxx的 xxx員工,正在研發淘寶手機客戶端軟體
u 網路維護工程師:員工號為xxx的 xxx員工,正在檢查網路是否暢通
u 硬體維護工程師:員工號為xxx的 xxx員工,正在修復印表機
l 建立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();
}
}