面向對象(一)

面向對象的定義:從現實世界中客觀事物出發構建軟件系統,並在系統的構造中儘可能運用人類的思維方式。

類是用於描述同一個類對象的一個抽象概念,類通過屬性和方法來對事物的靜態屬性和動態屬性

類可以看成是一類對象的模板,對象可以看成一個類的具體實例。

車的定義,具有哪些特徵纔算是車,能載人(靜態屬性),能跑---前後左右(動態屬性)車的外形,構造,比如,方向盤,車門,玻璃,車的顏色都是車的靜態屬性

總結:車有靜態和動態的屬性,在java中就有靜態成員和動態成員(方法)去驅動這車,這就是把車給抽象開來,我們把車叫做類,書本也是一個類,電子產品也是一個類,我們把一類事物的具體某一個東西,符合這類事物特徵的某個東西叫做對象。

 eg.職員這個類該怎麼抽象出來?也是從兩個方面,一方面是它的靜態屬性,另一方面它的動態屬性


  職員有哪些屬性呢?有姓名,年齡,目前工資數額等屬性,

他有哪些方法呢?讓這個職員來顯示姓名,顯示年齡,修改姓名,領取工資。當然顯示姓名,顯示年齡,修改姓名,領取工資這些也可以讓別人來做,

但面向對象的設計思維是最合適的方法應該出現在最合適的類裏面。顯示姓名,顯示年齡,修改姓名,領取工資由誰來做更合適呢,那就是職員自己最合適。

所以這些方法應該出現在職員這個類裏面。

根據方法是沒辦法區分兩個對象的。所以每個對象都有自己的屬性,屬性值和另外一個對象一般是不一樣的

繼承:xX is XX

繼承是單繼承的

繼承於覆蓋難點

當子類需要調用父類的構造方法的時候,需要注意

1)如果父類中無構造方法或者有一個無參的構造方法,子類也無構造方法,子類會顯示地調用父類的構造方法

2)如果父類的構造方法有參構造,那麼子類點用必須顯式地調用有參的構造方法,要不然會報錯

3)如果父類有無參和有參的構造方法,子類默認調用無參構造方法

方法覆蓋:

1,子類覆蓋父類地方法必須具有同樣的參數返回類型

2,參數返回類可以是父類返回類的子類

3,子類只能把修飾符的作用域放大,而不能縮小 

4,繼承具有多態

多態:

.可替換性(substitutability)。多態對已存在代碼具有可替換性。例如,多態對圓Circle類工作,對其他任何圓形幾何體,如圓環,也同樣工作。

2.可擴充性(extensibility)。多態對代碼具有可擴充性。增加新的子類不影響已存在類的多態性、繼承性,以及其他特性的運行和操作。實際上新加子類更容易獲得多態功能。例如,在實現了圓錐、半圓錐以及半球體的多態基礎上,很容易增添球體類的多態性。

3.接口性(interface-ability)。多態是超類通過方法簽名,向子類提供了一個共同接口,由子類來完善或者覆蓋它而實現的。如圖8.3 所示。圖中超類Shape規定了兩個實現多態的接口方法,computeArea()以及computeVolume()。子類,如Circle和Sphere爲了實現多態,完善或者覆蓋這兩個接口方法。

4.靈活性(flexibility)。它在應用中體現了靈活多樣的操作,提高了使用效率。

5.簡化性(simplicity)。多態簡化對應用軟件的代碼編寫和修改過程,尤其在處理大量對象的運算和操作時,這個特點尤爲突出和重要。

多態的運用

this.show(O)、super.show(O)、this.show((super)O)、super.show((super)O)。

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));     ⑨   


  當超類對象引用變量引用子類對象時,被引用對象的類型而不是引用變量的類型決定了調用誰的成員方法

,但是這個被調用的方法必須是在超類中定義過的,也就是說被子類覆蓋的方法。 

比如④,a2.show(b),a2是一個引用變量,類型爲A,則this爲a2,b是B的一個實例,於是它到類A裏面找show(B obj)方法,沒有找到,

於是到A的super(超類)找,而A沒有超類,因此轉到第三優先級this.show((super)O),

this仍然是a2,這裏O爲B,(super)O即(super)B即A,因此它到類A裏面找show(A obj)的方法,類A有這個方法,

但是由於a2引用的是類B的一個對象,B覆蓋了A的show(A obj)方法,因此最終鎖定到類B的show(A obj),輸出爲"B and A”。

http://www.jb51.net/article/34413.htm



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章