1. 程式人生 > >黑馬程序猿——JAVA面向對象的特性:封裝,繼承,多態

黑馬程序猿——JAVA面向對象的特性:封裝,繼承,多態

面向對象 結構 無法 tex col data- emp ngs 不能

- ----------android培訓java培訓、java學習型技術博客、期待與您交流!------------

一、java面向對象的特性。封裝、繼承、多態

封裝

封裝是對象和類概念的主要特性。

封裝。也就是把客觀事物封裝成抽象的類。而且類能夠把自己的數據和方法僅僅讓可信的類或者對象操作,對不可信的進行信息隱藏。

繼承

面向對象編程 (OOP) 語言的一個主要功能就是“繼承”。繼承是指這樣一種能力:它能夠使用現有類的全部功能。並在無需又一次編寫原來的類的情況下對這些功能進行擴展。

通過繼承創建的新類稱為“子類”或“派生類”,被繼承的類稱為“基類”、“父類”或“超類”。

繼承的過程,就是從一般到特殊的過程。

要實現繼承,能夠通過“繼承”(Inheritance)和“組合”(Composition)來實現。在某些 OOP 語言中。一個子類能夠繼承多個基類。可是普通情況下,一個子類僅僅能有一個基類,要實現多重繼承。能夠通過多級繼承來實現。

繼承概念的實現方式有三類:實現繼承、接口繼承和可視繼承。

實現繼承是指使用基類的屬性和方法而無需額外編碼的能力;

接口繼承是指僅使用屬性和方法的名稱、可是子類必須提供實現的能力;

可視繼承是指子窗口(類)使用基窗口(類)的外觀和實現代碼的能力。

在考慮使用繼承時,有一點須要註意,那就是兩個類之間的關系應該是“屬於”關系。比如,Employee 是一個人,Manager 也是一個人,因此這兩個類都能夠繼承 Person 類。可是 Leg 類卻不能繼承 Person 類,由於腿並非一個人。

抽象類僅定義將由子類創建的一般屬性和方法。OO開發範式大致為:劃分對象→抽象類→將類組織成為層次化結構(繼承和合成) →用類與實例進行設計和實現幾個階段。

多態

多態性(polymorphism)是同意你將父對象設置成為和一個或很多其它的他的子對象相等的技術,賦值之後,父對象就能夠依據當前賦值給它的子對象的特性以不同的方式運作。簡單的說,就是一句話:同意將子類類型的指針賦值給父類類型的指針。

實現多態。有二種方式。覆蓋,重載。

覆蓋(override),是指子類又一次定義父類的虛函數的做法。

重載(overload),是指同意存在多個同名函數,而這些函數的參數表不同(也許參數個數不同,也許參數類型不同,也許兩者都不同)。

事實上,重載的概念並不屬於“面向對象編程”,重載的實現是:編譯器依據函數不同的參數表,對同名函數的名稱做修飾,然後這些同名函數就成了不同的函數(至少對於編譯器來說是這種)。

比方有兩個同名函數:functionfunc(p:integer):integer;和functionfunc(p:string):integer;。

那麽編譯器做過修飾後的函數名稱可能是這種:int_func、str_func。對於這兩個函數的調用。在編譯器間就已經確定了,是靜態的(記住:是靜態)。也就是說。它們的地址在編譯期就綁定了(早綁定),因此,重載和多態無關!真正和多態相關的是“覆蓋”。當子類又一次定義了父類的虛函數後。父類指針依據賦給它的不同的子類指針,動態(記住:是動態!

)的調用屬於子類的該函數,這種函數調用在編譯期間是無法確定的(調用的子類的虛函數的地址無法給出)。

因此,這種函數地址是在執行期綁定的(晚邦定)。結論就是:重載僅僅是一種語言特性,與多態無關,與面向對象也無關!

關於多態 “不要犯傻。假設它不是晚綁定,它就不是多態。

那麽,多態的作用是什麽呢?我們知道。封裝能夠隱藏實現細節,使得代碼模塊化;繼承能夠擴展已存在的代碼模塊(類)。它們的目的都是為了——代碼重用。而多態則是為了實現還有一個目的——接口重用!多態的作用,就是為了類在繼承和派生的時候,保證使用“家譜”中任一類的實例的某一屬性時的正確調用。

二、詳細用一個實例來表明

public class BasicInfo {
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 BasicInfo() {
super();
name = "張三";
age = 18;
}

public BasicInfo(String name, intage) {
super();
this.name = name;
this.age = age;
}

@Override
public String toString() {
return "BasicInfo[name=" + name + ", age=" + age + "]";
}

}

//Student類從BasicInfo類繼承而來,構造函數相同具有多態性,並對屬性school進行了封裝
public class Student extendsBasicInfo{
private String school;

public String getSchool() {
return school;
}

public void setSchool(Stringschool) {
this.school = school;

}

public Student(Stringschool) {
super();
this.school = school;
}

public Student() {
super();
school ="英國克萊登大學";
}

public Student(String name,int age) {
super(name, age);
school ="英國克萊登大學";
}

@Override
public String toString() {
return "Student[school=" + school +",name="+getName()+",age="+getAge()+"]";
}

}

對於以上提供的兩個類,一個基本信息類。實現事實上信息類中屬性的封裝及多態性,一個學生類實現對基本信息類的繼承以及自有屬性的封裝,更好解釋它的特性。

黑馬程序猿——JAVA面向對象的特性:封裝,繼承,多態