封裝和繼承幾乎都是為多態而准備的
首先,屬性能夠描述事物的特征,方法能夠描述事物的動作。封裝就是把同一類事物的共性(包括屬性和方法)歸到同一類中,方便使用。
1) 實現了專業的分工
2) 良好的封裝能夠減少耦合
3) 類內部的結構能夠自有修改
4) 可以對成員進行更精確的控制
5) 隱藏信息,實現細節
1) 修改屬性的可見性來限制對屬性的訪問
2) 為每個屬性創建一隊賦值和取值方法,用於對這些屬性的訪問
3) 在賦值和取值方法中,加入對屬性的存取限制
為了實現良好的封裝,我們通常將類的成員變量聲明為private,在通過public方法來對這個變量來訪問。對一個變量的操作,一般有讀取和賦值2個操作,,我們分別定義2個方法來實現這2個操作,一個是getXX(XX表示要訪問的成員變量的名字)用來讀取這個成員變量,另一個是setXX()用來對這個變量賦值。
下面我們來看下這個例子:
public class Husband {
/*
* 對屬性的封裝一個人的姓名、性別、年齡、妻子都是這個人的私有屬性
*/
private String name;
private String sex;
private int age;
private Wife wife;
/*
* setter()、getter()是該對象對外開發的接口
*/
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public void setWife(Wife wife) {
this.wife = wife;
}
}
Java繼承是面向對象的最顯著的一個特征。繼承是從已有的類中派生出新的類,新的類能吸收已有類的數據屬性和行為,並能擴展新的能力。JAVA不支持多繼承,單繼承使JAVA的繼承關系很簡單,一個類只能有一個父類,易於管理程序,父類是子類的一般化,子類是父類的特化(具體化)
繼承所表達的就是一種對象類之間的相交關系,它使得某類對象可以繼承另外一類對象的數據成員和成員方法。若類B繼承類A,則屬於B的對象便具有類A的全部或部分性質(數據屬性)和功能(操作),我們稱被繼承的類A為基類、父類或超類,而稱繼承類B為A的派生類或子類。
繼承避免了對一般類和特殊類之間共同特征進行的重復描述。同時,通過繼承可以清晰地表達每一項共同特征所適應的概念范圍——在一般類中定義的屬性和操作適應於這個類本身以及它以下的每一層特殊類的全部對象。運用繼承原則使得系統模型比較簡練也比較清晰。
1) 繼承關系是傳遞的。若類C繼承類B,類B繼承類A(多繼承),則類C既有從類B那裡繼承下來的屬性與方法,也有從類A那裡繼承下來的屬性與方法,還可以有自己新定義的屬性和方法。繼承來的屬性和方法盡管是隱式的,但仍是類C的屬性和方法。
2) 繼承提供了軟件復用功能。若類B繼承類A,那麼建立類B時只需要再描述與基類(類A)不同的少量特征(數據成員和成員方法)即可。這種做法能減小代碼和數據的冗余度,大大增加程序的重用性。
3) 繼承通過增強一致性來減少模塊間的接口和界面,大大增加了程序的易維護性。
class Person1 {
public String name = "xiaomiao";
public int age = 20;
}
class Student extends Person1 {
void study() {
System.out.println("I can study!");
}
}
public class JiCheng {
public static void main(String args[]) {
Student stu = new Student();
// stu.name = "zhangsan";
// stu.age = 20;
System.out.println("name=" + stu.name + ",,," + "age=" + stu.age);
}
}
方法的重寫、重載與動態連接構成多態性;
Java之所以引入多態的概念,原因之一是它在類的繼承問題上和C++不同,後者允許多繼承,這確實給其帶來的非常強大的功能,但是復雜的繼承關系也給C++開發者帶來了更大的麻煩,為了規避風險,Java只允許單繼承,派生類與基類間有IS-A的關系(即“貓”is a “動物”)。這樣做雖然保證了繼承關系的簡單明了,但是勢必在功能上有很大的限制,所以,Java引入了多態性的概念以彌補這點的不足,此外,抽象類和接口也是解決單繼承規定限制的重要手段。同時,多態也是面向對象編程的精髓所在。
要理解多態性,首先要知道什麼是“向上轉型”。
我定義了一個子類Cat,它繼承了Animal類,那麼後者就是前者的父類。我可以通過
Cat c = new Cat(); 例化一個Cat的對象,這個不難理解。
但當我這樣定義時: Animal a = new Cat();
這代表什麼意思呢?
很簡單,它表示我定義了一個Animal類型的引用,指向新建的Cat類型的對象。由於Cat是繼承自它的父類Animal,所以Animal類型的引用是可以指向Cat類型的對象的。那麼這樣做有什麼意義呢?因為子類是對父類的一個改進和擴充,所以一般子類在功能上較父類更強大,屬性較父類更獨特,定義一個父類類型的引用指向一個子類的對象既可以使用子類強大的功能,又可以抽取父類的共性。所以,
父類引用只能調用父類中存在的方法和屬性,不能調用子類的擴展部分;因為父類引用指向的是堆中子類對象繼承的父類;(但是如果強制把超類轉換成子類的話,就可以調用子類中新添加而超類沒有的方法了。)
同時,父類中的一個方法只有在父類中定義而在子類中沒有重寫的情況下,才可以被父類類型的引用調用;
對於父類中定義的方法,如果子類中重寫了該方法,那麼父類類型的引用將會調用子類中的這個方法,這就是動態連接。