現實世界中我們可以對各種對象進行分類,並且類還有一定的等級、層次,下面以大家熟悉的動物的分類為例介紹分類的特點。
動物分類學家根據動物的各種特徵(形態、細胞、遺傳、生理、生化、生態和地球分布)進行分類,即自然分類法,將動物依次分為各種等級。即界、門、綱、目、科、屬、種等七個主要等級。其中種是分類所用的基本單位。每一種動物,都可以給它們在這個等級序列中冠以適當的名稱和位置。
大熊貓,屬於動物界、脊維動物門、哺乳綱、食肉目、大熊貓科、大熊貓屬。
現代人類在生物分類系統中的地位是:動物界、脊索動物門、哺乳動物綱、靈長目、人科、人屬、智人種。
在這個層次中,越向上抽象程度越高,是對下一層次的分類的共同特徵進行了抽象,具有的屬性會越少,因為抽象的過程實際上是提取共性,去除個性的過程,是下一級分類的屬性的交集。
在這個層次中,在向下描述的時候是增加特徵屬性的過程,例如我們在描述脊椎動物的時候,脊椎動物是所有體內具有脊椎骨的動物,脊椎動物除了具有脊索動物門的三項基本特徵:脊索、背神經管、鰓裂外,還具有一些其他的特徵(http://baike.baidu.com/view/345393.htm)。
也就是說脊椎動物首先是動物,然後具有一些顯著的特點。這樣脊椎動物的屬性就是動物具有的屬性和脊椎動物特有的屬性。
現實世界中的分類以及類的層次關係與軟體系統中對象的分類和類的層次關係是相同的。
1、父類、子類、祖先類、子孫類
在類的分層中,相鄰層次的類,處於頂層的稱為父類,處於下面一層稱為子類。
子類具有父類的所有屬性,子類具有比父類更多的屬性。例如脊椎動物具有動物的所有屬性,而脊椎動物還具有一些特殊的屬性。
如果某個對象屬於子類,那他肯定屬於父類。例如,人屬於脊椎動物,人肯定屬於動物。
父類包含更多的對象,動物除了包含所有的脊椎動物之外,還包括非脊椎動物,是對更多個物件的抽象,能夠表示更多的對象。
在類層次中,處於某個類之上的所有層次都可以稱為當前層的祖先類。例如,動物界、脊索動物門、哺乳動物綱、靈長目都可以稱為人科的祖先類。
在類層次中,處於某個類之下的所有層次都可以稱為當前層的子孫類。例如,脊索動物門、哺乳動物綱、靈長目和人科都屬於動物的子孫類。
有時候使用超類來表示父類,通常情況下不需要嚴格區分父類與祖先類,子類與子孫類。
2、單繼承與多繼承
在現實世界我們按照某種方式進行分類的時候,類的階層通常表現為一顆倒立的樹,具體下面的特點:樹中的每個節點可以有1個父類或者沒有父類(最頂層),可以有多個子類或者沒有子類(最下層)。這種情況稱為單繼承。
有一些情況下,根據分類的標準可能會造成某個子類有多個父類,例如:對學校中的人員進行分類,按照工作情況分工,可以分為學生、教師、後勤,按照是否為黨員劃分可以分為黨員和群眾。這樣對於一個學生黨員來說,他的父類可以是學生也可以是黨員,就有兩個父類了。具有兩個或者多個父類稱為多繼承。
在Java中直接支援單繼承,多繼承需要通過實現介面來實現,關於介面在後面介紹。
3、實現繼承
通過關鍵字extends實現繼承,例如類B繼承了類A,可以寫成:
public class A{
// 父類A中的屬性
}
public class B etends A{
// B中特有的屬性
}
實現繼承之後B類的屬性就包括B中重新定義的屬性以及從A類繼承過來的屬性。
4、Object類
Object類是所有類的祖先類,是最頂層類。
如果某個類沒有定義父類,則父類就是Object。
上面的類A沒有聲明父類,它的父類就是Object。
關於Object的用法在後面單獨介紹。
5、抽象與派生
在3中,我們先定義了類A,在A中定義了屬性。然後定義了類B,繼承自類A,並增加了一些屬性,這樣類B的屬性就包括從A中繼承的屬性以及重新定義的屬性。這個過程稱為從類A派生出類B。
如何知道父類中有哪些屬性,子類中有哪些屬性,要建立多少個類呢?
這是物件導向分析與設計需要完成的任務,父類的出現主要是為了讓多個子類共用代碼,也就是把多個子類中重複的代碼提取出來形成父類,這是一個抽象的過程,抽象出各個子類共同代碼。例如,學校的選課系統包含學生和教師,正常情況下我們會建立教師類和學生類,但是學生類和教師類會包含一些相同的屬性和方法,例如姓名、性別、連絡方式等,如果在學生類和教師類中都要維護這些資訊,當某個屬性發生改變的時候需要修改兩個類,並且明顯存在著代碼重複的問題,這時候可以考慮把共同的屬性和方法提取出來產生一個新類,作為學生類和教師類的父類。
下面的代碼展示了這個過程:
抽象之前:
public class Student{
public String name;
public String studentId;
public String class;
public String sex;
public String address;
public String phone;
//相關方法
}
public class Teacher{
public String name;
public String teacherId;
public String department;
public String sex;
public String address;
public String phone;
//相關方法
}
抽象之後:
public class Person{
public String name;
public String sex;
public String address;
public String phone;
// 共用的方法
}
public class Student extends Person{
public String studentId;
public String class;
// 學生類特有的方法
}
public class Teacher extends Person{
public String teacherId;
public String department;
// 教師類特有的方法
}
是否是所有的方法和屬性都可以繼承呢?哪些可以繼承?請聽下回講解。
上一次:
第三十二講 靜態成員下一次:第三十四講 包 李緒成 CSDN Blog:http://blog.csdn.net/javaeeteacher邀請您為好友:http://student.csdn.net/invite.php?u=124362&c=7be8ba2b6f3b6cc5