javaSE_面向物件程式設計之類與物件
一、面向物件程式設計:
現在的程式設計主要有一下幾種:
1)面向物件程式設計
- 例子:狗吃屎(主要突出的是狗和屎兩個物件)
- 每個物件 ----> 是一個類
- 屬性及方法 —> 能夠進行現實生活的抽象
- 名次擴充套件: OOA:面向物件分析 OOD:面向物件設計 OOP:面向物件程式設計
2)面向過程程式設計
例子:吃狗屎(主要突出 吃 這一過程)
3)面向切面程式設計(EE-AOP)
4)面向介面程式設計 - 介面優先原則
5)函數語言程式設計
二、面向物件程式設計的三大特徵:
-
封裝性:所謂封裝,也就是把客觀事物封裝成抽象的類,並且類可以把自己的資料和方法只讓可信的類或者物件操作,對不可信的進行資訊隱藏。簡而言之就是,內部操作對外部而言不可見(保護性)
-
繼承性:繼承是指這樣一種能力:它可以使用現有類的所有功能,並在無需重新編寫原來的類的情況下對這些功能進行擴充套件。
-
多型性(*):所謂多型就是指一個類例項的相同方法在不同情形有不同表現形式。多型機制使具有不同內部結構的物件可以共享相同的外部介面。
三、類與物件的定義與使用
-
所謂的類是指共性的概念,而物件指的是一個具體的、可以使用的事物。
-
產生:首先產生類(類是生產物件的藍圖),而後才可以產生物件。物件的所有行為,一定在類中進行了完整的定義。
3.1 類與物件的定義:
舉個例子(定義一個Person類):
其中關鍵字new的作用:開闢記憶體,,,只要出現了關鍵字new,就開闢了記憶體 Java中,所謂的效能調優,調整的就是記憶體問題
4、物件記憶體分析
我們可以簡單的將java中的記憶體區域分為棧記憶體和堆記憶體兩塊區域(實際Java記憶體區域的劃分遠比這個複雜,後續會詳細講述)
- 棧記憶體(虛擬機器區域性變量表):存放的是區域性變數(包含編譯期可知的各種基本資料型別、物件引用-即堆記憶體的地址,可以簡單的理解為物件的名稱),Java棧是與執行緒對應起來的,每當建立一個執行緒,JVM就會為這個執行緒建立一個對應的Java棧。
- 堆記憶體:儲存的是真正的資料。即物件的屬性資訊 具體分析如下:
注意:
物件(引用資料型別)必須在例項化後呼叫,否則會產生NullPointerException(執行時錯誤),編譯時不會出錯"NullPointerException"在各位今後的開發生涯中會一直存在,只有引用型別(陣列、類、介面)才會產生此類異常。以後出現此類異常,就根據出錯位置檢視引用型別變數是否初始化
- 引用傳遞分析 引用傳遞的本質:一塊堆記憶體可以被多個棧記憶體所指向
垃圾空間:沒有任何棧記憶體指向的堆記憶體空間 建議:所有的垃圾空間會不定期GC,GC會影響效能,所以開發之中一定要控制好物件的產生數量(無用的物件儘量少產生)
四、private實現封裝和構造方法
private 封裝
封裝是面向物件裡最複雜的概念,使用private關鍵字實現的封裝處理只是封裝的第一步,若想完全掌握封裝,需要後續將繼承和多型學完。
無封裝範例: 在沒有封裝屬性的情況下,外部通過屬性可以對物件進行任意操作,為了解決這個問題,可以使用private對物件進行封裝(物件不能直接操作屬性)。
使用private封裝後要訪問私有屬性,需要使用setter和getter方法:
- setter方法:主要用於進行屬性內容的設定與修改
- getter方法:主要用於屬性內容的取得
類的設計原則:沒有特殊說明,在編寫類的時候,所有屬性(成員變數)必須使用private封裝。
構造方法:
所謂的構造方法就是使用關鍵字new例項化新物件時來進行呼叫的操作方法。
對於構造方法的定義,也需要遵循以下原則:
- 方法名稱必須與類名稱相同
- 構造方法沒有返回值型別宣告
- 每一個類中一定至少存在一個構造方法(沒有明確定義,則系統自動生成一個無參構造) 注意:沒有返回值型別宣告,不是沒有返回值(不能加void)
編譯器是根據程式結構來區分普通方法與構造方法的,所以在構造方法前沒有返回值型別宣告 若類中定義了構造方法,則預設的無參構造將不再生成
構造方法的過載:
構造方法的引數個數和型別不同 建議:若干構造方法,請按照引數個數升序或降序