封裝
封裝就是隱藏對象的屬性和實現細節,暴露出外部訪問的接口,控制在程序中屬性的讀取和修改的訪問級別。
通過訪問修飾符控制(private、public,protected,default)
private:當前對象方法以及內部類、匿名類訪問。
public:所有對象以及包括外部程序訪問。
protected:和private一樣 ,當前對象方法以及內部類、匿名類訪問。不同點就是,通過繼承的子類可以訪問。
default:如果不寫修飾符,就是默認的包級別,當前包裏面的類可以訪問。
隱藏實現細節,怎麼隱藏,天天掛着嘴邊的面向接口編程怎麼面向接口、什麼高內聚、低耦合。
隱藏:通過類包裝數據和行爲,隱藏的部分一般都是比較脆弱的,需要優化或者重構的,如果暴露出來就會很容易出bug。
我們常見的服務端程序暴露API給客服端,(高內聚,自己能做的事,都自己做)服務端能做的事情自己做,不要把服務端的信息暴露給客服端,如果客服端依賴服務端,服務器端改了,客服端也要做相應的修改。
面向接口編程好處,定義接口規範,不管實現類內部如何重構、優化,只要不改變方法的行爲,都不會影響客服端。
繼承
is-a 是Ta 、is-like-a 像Ta的區別
說的白話一點就是is-a 就是重寫父類的方法,is-like-a 重寫父類的方法,並且有自己的方法
is-like-a
public abstract class AbstractBird {
protected String color;
protected String name;
public AbstractBird(String color, String name) {
this.color = color;
this.name = name;
}
public void show() {
System.out.println("看那是" + this.name + ":顏色是" + this.color);
drinking();
goWalk();
sleep();
}
public abstract void goWalk();
public abstract void sleep();
public abstract void drinking();
}
public class Zoo {
private AbstractBird abstractBird;
public Zoo(AbstractBird abstractBird) {
this.abstractBird = abstractBird;
}
public void show() {
//向上轉型 is-a
this.abstractBird.drinking();
//向下轉型 is-like-a
Magpie magpie = (Magpie) abstractBird;
magpie.singing();
}
}
多態
多態分兩種:
(1) 編譯時多態(設計時多態):方法重載。
(2) 運行時多態:JAVA運行時系統根據調用該方法的實例的類型來決定選擇調用哪個方法則被稱爲運行時多態。(我們一般說的都是運行時多態,所以多態主要也是指運行時多態)
第一種實現多態,RTTI(Run-Time Type Identification),通過運行時類型信息程序能夠使用基類的指針或引用來檢查這些指針或引用所指的對象的實際派生類型。
第二種就是我們用的發射實現
在古代中國神話傳說中,龍生有九子,九子不成龍,各有所好。
money (100元,50元,20元,10元,5元,1元) 每張都形狀,圖案,大小,顏色都體現不一樣。
組合
組合是一種強依賴
例如:房子和臥室,如果房子沒有了,臥室也沒有了.
class Room{
public Room createRoom(){
return new Room();
}
}
class House{
private Room room;
public House(){
room = new Room();
}
public void createRoom(){
room.createRoom();
}
}
聚合
例如:人擁有電腦,就是一種擁有關係
class Computer{
public void typeWriting(){
System.out.println("打字");
}
}
class Person{
private Computer cp ;
public Person(Computer cp){
this.cp = cp;
}
//用電腦打字
public void play(){
cp.typeWriting();
}
}