JAVA中的面向對象初學(持續總結更新...)

面向對象三個特徵:封裝,繼承,多態

類定義完成後需要聲明並實例化對象,而實例化操作時的引用數據類型,如String,int等,都需要關鍵字new來分配堆空間,如果只是聲明對象而不進行實例化操作,就會出現空指向異常的錯誤。

實例化之後,訪問屬性或方法時用“對象.屬性/方法”


引用傳遞:

同一塊堆內存間被多個棧空間地址所指向,不同的棧可以修改同一堆內存的內容。如果堆內存空間沒有任何對象指向,就會成爲垃圾數據等待GC回收。

封裝:

類中屬性或方法加上private,使之只能被本類中對象所操作。如果類外想操作,需要先在類內用setter,getter寫對外接口對象(方法),因爲該方法時public的,所以類外可以調用。如果想檢測類外傳輸的數據是否正確,可以先在接口對象方法中寫驗證代碼。


構造方法

構造方法在實例化對象的時候使用,且對象的構造方法只會顯示調用一次,且堆內存的空間分配只有在執行構造函數後纔會進行。普通方法在實例化對象之後使用。

構造方法的名稱和類名稱一致,不允許有返回值類型聲明。如果類中沒有明確定義構造方法,則會自動生成一個無參數的,無返回值的構造方法。一個類中至少存在一個構造方法。即類中一定存在至少一個構造方法。

構造方法的編寫順序強調有個順序編寫,如按照參數的個數多少。


匿名對象

沒有棧指針指向的堆內存空間,只能一次性使用,使用完畢成爲垃圾


this指針

表示  、 強調本類中的方法調用或屬性操作。

JAVA中this的作用:表示本類屬性,本類方法,當前對象

本類屬性:構造函數中定義屬性內容,當要明確指定操作的是類中屬性的時候。

本類方法:一個類中有多個構造方法,多個構造方法內部的參數部分重複,可以用this來完成構造方法之間的互相調用操作。this()調用構造方法的操作一定要在構造方法的首行。

當前對象:當前正在調用本類方法。


String類

string類的構造:public String(String str)實現對象實例化
== 比較字符串內存地址的數值
equal()比較兩個字符串的內容

字符串常量是String類的匿名對象
兩種實例化對象:
1,直接賦值:無論實例化多少個對象,只要是賦值的字符串常量相同,開闢堆內存只有一塊,所有的堆內存都被多個棧內存所指向,自動入池。
2,構造方法賦值:實際上會開闢兩塊空間,一塊將成爲垃圾。實例化的對象不會自動入池。可手工入池:public  String  intern()。
字符串的內容一旦聲明則不可改變,如刪,增字符,因爲字符串內容的改變,實際上改變的是字符串對象的引用過程,使存儲在棧內存的對象指針不斷改變堆內存的地址,改變後的堆內存就成了垃圾。

對象比較:equals()
語法:
public boolean equals(Object anObject)
即括號內部表示的是該對象字符串,不是要比較的字符串。而字符串常量是匿名對象,不爲空null。也就是在equal前面的對象字符串不能爲null,只能是具體的某個需要比較的字符串,如:
public class TestDemo {
		public static void main(String args[]) {
                   String str = null ;          // 假設是輸入的
                   if ("HELLO".equals(str)) {
                            System.out.println("條件滿足。") ;
                   }
         }
}


static

用於定義屬性和方法,使之和普通屬性/方法區分,表示公共的概念,獨立於類之外,定義的屬性屬於全局數據區。(普通屬性保存在堆內存中)
static定義的屬性表示類屬性,調用方式:通過“類名稱.static屬性”完成。
static定義的屬性或方法可以在沒有實例化對象的時候使用,非static定義的屬性和方法,必須實例化對象後纔可以進行調用。因此不能調用非static的方法或屬性。

內部類

指的是一個類的內部定義了其他類的情況。
優點:使內部類和外部類可以方便的互相訪問彼此的私用操作,不需要set,get。但是內部想表示外部類的當前對象時,應該用“外部類.this.”。
缺點:使外部類除了屬性和方法外又多了一個類,破壞了程序的結構

外部類實例化內部類的對象:
外部類.內部類    內部類對象 = new   外部類().new   內部類();
之所以要先實例化外部類對象,是因爲內部類需要訪問外部類的普通屬性,而普通屬性只有在對象實例化之後纔會被實例化。
如果內部類在android開發中,大多對其進行封裝。
內部類被static定義後,就會表示成”外部類“,只能訪問外部類中的static屬性。
方法中定義內部類,內部類訪問方法的參數或變量時,這些參數和變量前一定要加final,只是作爲標記

繼承性

語法:class  子類    extends   父類{ }
子類即派生類,父類即超類
繼承的限制:
1,一個子類只能繼承一個父類,單繼承侷限。Java只允許多層繼承,不允許多重繼承。
2,子類可以直接利用對象操作顯示繼承父類非私有操作,對於所有私有操作,只能隱式繼承或間接完成,比如用setter,getter方法
3.默認情況,子類會先調用父類的無參構造函數,相當於子類的構造函數中一定會有父類的super()構造函數,且一定要放在構造方法的首行上。想讓子類不去調用父類構造是不可能的。

覆寫

子類有和父類完全相同的方法和屬性的名稱,返回值類型,參數類型和個數的方法,該方法就稱爲方法的覆寫。
當類中的方法被覆寫之後,如果實例化的是這個子類對象,則調用的方法是覆寫過的方法。
侷限:
被子類覆寫的方法的方法一定要比父類更容易訪問,加入父類的方法時default權限,子類覆寫只能是default或public權限。父類是public,則子類只能是public。但是,如果父類定義了private的方法,則子類無法真正去覆寫父類的方法。
屬性的覆寫,即子類和父類的屬性名稱一樣,這種操作沒有意義。因爲屬性一定要封裝,封裝之後就沒有覆寫的概念了。

this.方法():先從本類查找指定的方法,如果沒有,就調用父類的操作方法。要放在首行。
super.方法():直接從子類調用父類的指定方法。要放在首行。

重載:方法名稱相同,參數類型和個數不同。可以改變返回值類型。
覆寫:方法,參數類型和個數,返回值類型完全相同。發生在繼承關係類中,被子類覆寫的方法不能擁有比父類更嚴格的訪問控制權限。

final

1,final定義的類不能有子類
2,final定義的方法不能被子類覆寫
3,final定義的變量表示常量,無法修改。再加上public static,就表示全局常量。且變量標識符都要大寫。


設計模式

單例設計模式

從構造方法被私有化說起。
當構造方法私有化時,外部就無法調用,只能本類調用,即無法在外部實例化該類的對象,只有本類才能產生實例化對象;
但是,如果一個類中存在普通屬性,而普通屬性一定要在本類存在了實例化對象後才能進行調用,而此時類外不能產生實例化對象,這個時候可用static定義,實質可以在沒有實例化對象的時候調用。
構造方法私有化只能通過get方法取得本類中的實例化對象,不管外部如何操作,最終只有一個實例化對象。在單例設計模式中,一定存在static方法,用於取得本類中的實例化對象。

多例設計模式



多態性

方法多態性:重載,覆寫
對象多態性:父子類對象的轉換
1,向上轉型:子類對象變爲父類對象,格式:父類 父類對象 = 子類實例,自動;
2,向下轉型:父類對象變爲子類對象,格式:子類 子類對象 = (子類父類實例,強制;
3,不轉型。
向下轉型操作可能會出現問題,可先判斷某一對象是否是某一對象的實例,可用instanceof關鍵字,返回的是boolean

抽象類

包含的抽象方法只聲明未實現。抽象方法一定要在抽象類中,用abstract定義。抽象類除了抽象方法外,還有普通方法,屬性,而屬性必須在構造方法執行完畢纔可以初始化操作,也就是,抽象類可以包含構造方法來初始化屬性。反過來,抽象類可以沒有抽象方法,此時不能夠被直接實例化。
抽象類必須有子類繼承,且一個子類只能繼承一個抽象類。所以抽象類不能用final定義。
如果子類不是抽象類,必須覆寫抽象類中的全部抽象方法
抽象類對象可用對象的向上轉型方式,通過子類進行實例化操作
外部抽象類不能使用static聲明。
應用:模板設計模式

接口

類定義的時候全部由抽象方法和全局常量組成,無法直接對象實例化。關鍵字interface。
使用原則:
1,每個接口必須定義子類,子類用implement關鍵字實現。
2,如果子類不是抽象類,必須覆寫接口定義的全部抽象方法。
3,子類對象實例化操作採用向上轉型

一個子類可以同時實現多個接口,但是隻能繼承一個父類。如果一個類既要實現接口又要繼承抽象類,應該先繼承後實現。接口的訪問權限只有public。
一個接口不能繼承抽象類,可以繼承多個接口。
應用:工廠設計模式(中間有過渡操作)
代理設計模式






















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