1.封裝 Encapsulationjava
封裝Encapsulation的定義:
is the process of hiding the implementation details of an object 隱藏了一個對象的實現細節
The internal state is usually not accessible by other objects 內部的狀態也不爲其餘對象所訪問
The only access to manipulate the object data is through its interface 對象的數據只能經過接口去訪問
Encapsulation allows objects to be viewed as ‘black boxes’ 封裝使得對象能夠被當作一個「黑盒子」
It protects an object’s internal state from being corrupted by other objects. 保護數據
Also, other objects are protected from changes in the object implementation. 一個對象實現方法的改變,不影響其餘相關對象
Communication is achieved through an ‘interface’ 對象間經過「接口」進行通訊安全
要封裝什麼?
內部的、不想讓其餘人隨意瞭解的信息
能夠封裝類的屬性,如,「人」 這個類,封裝我的的工資、資產、年齡等信息
能夠封裝類的方法,如, 「人」如何賺錢()?如何消磨時間()?
咱們爲何要封裝
保護隱私
保護數據安全
隔離複雜度 (內部實現細節不對外公開)。如「空調」,封裝了製冷的過程,對人提供了一個製冷的按鈕
面向對象的封裝有四種方式(可見性)
Public
Private
Protected
Package 測試
規則:對象應該只顯示與之交互所需的接口。與對象的使用無關的詳細信息應該對其餘對象隱藏。這是封裝的通常規則spa
建議:對外提供Getters和Setters支持數據隱藏的概念由於其餘對象不該該直接操做另外一個對象中的數據。例如,若是用戶須要訪問某個屬性,則調用方法返回該屬性(getter) orm
2.繼承 Inheritance對象
什麼是繼承blog
定義:有兩個類:A類與B類,當兩個類之間產生父子關係的時候,咱們稱爲繼承。
繼承是一種新建類的方式,繼承的類稱之爲子類或派生類。
被繼承的類稱之爲父類或基類或超類。
子類繼承父類,也就意味着子類繼承了父類全部的屬性和方法,能夠直接調用。
java使用extends關鍵實現兩個類的繼承關係
語法:
public class FatherClass{
//屬性
//方法
}
public class ChildClass extends FatherClass{
//屬性
//方法
}
爲何使用繼承:
繼承
提升代碼的複用性,使類與類之間產生了繼承的關係,也是多態的前提接口
3.多態 Polymorphism
ip
定義:
本意:有多種形態 「Having many forms」
「When one class inherits from another, then polymorphism allows a subclass to stand in for the superclass.」 當一個類從另外一個類繼承而來,多態使得子類能夠代替父類
The sender of a stimulus doesn’t need to know the receiver’s class消息發送方不須要知道消息接收方屬於那個子類
Different receivers can interpret the message in their own way同一類族的接收者能夠按本身的方式處理消息
推論Consequence
different receivers can response to the same stimulus based on their interpretation同一類族的接收者能夠按本身的方式處理同一個消息
So we can have a variety of objects who process the same piece of data in different ways.有多種對象能夠按本身的方式處理相同的數據
舉例:
以下圖,Jet繼承AirPlane,而後AirPlane繼承Plane
多態的三個條件:
1) 繼承的存在(繼承是多態的基礎,沒有繼承就沒有多態).
2) 子類重寫父類的方法(多態下調用子類重寫的方法).
3) 父類引用變量指向子類對象(子類到父類的類型轉換).
子類轉換成父類時的規則:
將一個父類的引用指向一個子類的對象,稱爲向上轉型(upcastiog),自動進行類型轉換.
此時經過父類引用調用的方法是子類覆蓋或繼承父類的方法,不是父類的方法.
此時經過父類引用變量沒法調用子類特有的方法.
若是父類要調用子類的特有方法就得將一個指向子類對象的父類引用賦給一個子類的引用,稱爲向下轉型,此時必須進行強制類型轉換.
多態是因爲繼承和重寫機制,相同類型的對象,執行相同的方法,獲得的結果可能不同。 例如:我再給以上例子的圓類中加一些代碼: public class Circle extends Shape{ //特有的半徑屬性 public float R; //得到半徑的方法 public void GetR(float r){ R=r; } //重寫周長和麪積的方法 public void Length(){ float a = (float) ((float)2*3.14*R);; System.out.println("周長是"+a); } public void Area(){ float b = (float)3.14*R*R; System.out.println("面積是"+b); } } 測試代碼: public static void main(String[] args) { Circle cir = new Circle(); cir.GetR(3); cir.Area(); cir.Length(); } 測試結果並非Shape中的方法執行的結果,因爲方法相同,可是繼承以後子類重寫了方法,方法體不一樣,致使了最後結果不同,這就是多態。