Java面向物件的理解
一、封裝
定義:
就是資訊隱藏,是指利用抽象資料型別將資料和基於資料的操作封裝在一起,使其構成一個不可分割的獨立實體,資料被保護在抽象資料型別的內部,儘可能地隱藏內部的細節,只保留一些對外介面使之與外部發生聯絡。
使用封裝有三大好處:
1、良好的封裝能夠減少耦合。
2、類內部的結構可以自由修改,可以對成員變數進行更精確的控制。
3、隱藏資訊,實現細節。
二、繼承
繼承和抽象就像硬幣的兩面,密不可分。
抽象定義:
表示對問題領域進行分析、設計並從中得出抽象的高層次概念,具體就是將一類實體的共同特性抽取並封裝在類中。
繼承定義:
從已有的類(抽象出來的類,不一定是抽象類)中派生出新的類,新的類能吸收已有類的資料屬性和行為,並能擴充套件新的能力,但不能選擇性地繼承父類。
通過使用繼承我們能夠非常方便地複用以前的程式碼,能夠大大的提高開發的效率。
在繼承關係中,子類可以完全替代父類,反之則不可以,我們將其稱之為“向上轉型”。
在使用繼承時需要記住三句話:
1、子類擁有父類非private的屬性和方法。
2、子類可以擁有自己屬性和方法,即子類可以對父類進行擴充套件。
3、子類可以用自己的方式實現父類的方法。(重寫)。
對於繼承,你必須知道如下三個知識點:構造器、protected、向上轉型
1、對於繼承而言,子類會預設呼叫父類的構造器,但是如果沒有預設的父類構造器,子類必須要顯示的指定父類的構造器,而且必須是在子類構造器中做的第一件事(第一行程式碼)。
2、protected關鍵字修飾的屬性或方法,只能在子類中呼叫,不能在繼承體系外訪問呼叫。
3、向上轉型,向上轉型是從子類到父類的轉換,所以它總是安全的,但會丟失子類的屬性和方法。
繼承存在如下缺陷:
1、父類變,子類就必須變。
2、繼承破壞了封裝,對於父類而言,它的實現細節對與子類來說都是透明的。
3、繼承是一種強耦合關係。
三、多型:
定義:
是指程式中定義的引用變數所指向的具體型別和通過該引用變數發出的方法呼叫在程式設計時並不確定,而是在程式執行期間才確定,因為在程式執行時才確定具體的類,這樣,不用修改源程式程式碼,就可以讓引用變數繫結到各種不同的類實現上(就是new 不同的子類),從而導致該引用呼叫的具體方法隨之改變。
Java實現多型有三個必要條件:繼承、重寫、向上轉型。
繼承:在多型中必須存在有繼承關係的子類和父類。
重寫:子類對父類中某些方法進行重新定義,在呼叫這些方法時就會呼叫子類的方法。
向上轉型:需要將子類的引用賦給父類物件。
實現方式:
基於繼承類的方式實現多型,繼承類,可以是普通類,可以是抽象類
基於實現介面的方式實現多型
方法呼叫的優先順序
class A ...{
public String show(D obj)...{
return ("A and D");
}
public String show(A obj)...{
return ("A and A");
}
}
class B extends A...{
public String show(B obj)...{
return ("B and B");
}
public String show(A obj)...{
return ("B and A");
}
}
class C extends B...{}
class D extends B...{}
A a1 = new A();
A a2 = new B();
B b = new B();
C c = new C();
D d = new D();
System.out.println(a1.show(b)); ①
System.out.println(a1.show(c)); ②
System.out.println(a1.show(d)); ③
System.out.println(a2.show(b)); ④
System.out.println(a2.show(c)); ⑤
System.out.println(a2.show(d)); ⑥
System.out.println(b.show(b)); ⑦
System.out.println(b.show(c)); ⑧
System.out.println(b.show(d)); ⑨
輸出結果:
① A and A
② A and A
③ A and D
④ B and A
⑤ B and A
⑥ A and D
⑦ B and B
⑧ B and B
⑨ A and D
方法呼叫的優先順序:
this.show(O)、super.show(O)、this.show((super)O)、super.show((super)O)。