物件導向的程式是由對象組成的,每個對象包含對使用者公開的特定功能部分和隱藏的實現部分。在物件導向程式設計(OOP)中,不必關心對象的具體實現。在傳統的結構化程式設計中,演算法是第一位的,資料結構是第二位的,即首先確定如何運算元,再考慮如何組織資料,以方便操作。而OOP則顛倒了這種次序,將資料放在第一位,然後再考慮操作資料的演算法。
一、類
類是構造對象的模板和藍圖。通俗地說,類相當於建築的圖紙,而對象相當於建築物。由類構造對象的過程稱為建立對象的執行個體。
Java中通過關鍵字class定義“類”,後跟類名。例如:
定義了一個Person類。
1.欄位和方法
定義一個類時,可以在類裡設定兩種類型的元素:資料成員和成員函數。其中資料成員是一種對象,可以是任何類型。如果是指向對象的控制代碼,則必須初始化這個控制代碼,通過構造器與一個實際對象串連起來。如果是基礎資料型別 (Elementary Data Type),則可以在類定義的位置直接初始化。
每個對象都為自己的資料成員保有儲存空間;資料成員不會在對象之間共用。
class Person{ String name; double salary;}
通過new關鍵字建立一個對象。如:
(1)主成員的預設值
某個主要資料類型屬於一個類成員,那麼即是不明確進行初始化,也可以保證他們獲得一個預設值。
| 主類型 |
預設值 |
| Boolean |
false |
| Char |
'\u0000'(null) |
| byte |
(byte)0 |
| short |
(short)0 |
| int |
0 |
| long |
0L |
| float |
0.0f |
| double |
0.0d |
如果一個變數作為類的成員變數,那麼對於主類型一定會得到初始化,要特別注意初始化的值。對於局部變數則會得到一些隨機值,如:int x;不會自動初始化為0。
(2)方法
方法的基本組成部分包括名字、自變數、傳回型別以及主體。方法的基本形式為:
傳回型別 方法名(/*自變數列表*/) {/* 方法體 */}
傳回型別是指調用方法之後返回的數實值型別。方法名是對具體方法的標識和引用。自變數列表列出****了想傳遞給方法的資訊類型和名稱。
在Java中方法的調用形式為對象名.方法名
1. 用控制代碼操作對象
儘管Java是完全物件導向的。但是,操作的標識符實際指向一個對象的“控制代碼”,又稱“引用”。控制代碼是可以獨立存在的,並不是說,擁有一個控制代碼就必須有一個對象與之對應。比如,int i;定義了一個整型變數i,並不表示它一定有值。如,建立一個String類型的控制代碼:
這裡只是建立了控制代碼,並沒有建立對象。由於s並沒有與之關聯的對象,如果調用s將出現異常。所以,建立時需要進行初始化。
在Java中,通過new關鍵字建立對象,它將返回對象的引用(即控制代碼)。所以
String s = new String("hello");
建立了一個內容為"hello"的String對象,並將該對象的控制代碼(引用)交給了s儲存。
2. 資料存放區的位置
1.寄存器。最快的儲存地區,位於處理器內部。寄存器的大小有限,由編譯器的分配大小。
2.堆棧。駐留在常規RAM(隨機訪問儲存空間)地區,通過“堆棧指標”可以改變大小。堆棧指標向下移動,會建立新的記憶體空間;向上移動,則釋放記憶體空間。建立程式時,Java編譯器必須準確地知道堆棧內儲存的所有資料的“長度”和“存在的時間”,編譯器由此產生相應的代碼,以便移動指標。Java對象的控制代碼儲存在其中,但是Java對象並不儲存在堆棧中。
3.堆。常規用途的記憶體池,其中儲存了Java對象。編譯器不知道也不需要知道從“記憶體堆”或“堆”裡分配多少儲存空間、資料存留多長時間。
4.靜態儲存。靜態指位於固定的位置(在RAM中)。程式運行期間,靜態儲存的資料將隨時供調用。通過static關鍵字指出一個對象的特定元素是靜態。Java本身本不可能置於靜態儲存空間。
5.常數儲存。常數值通常置於程式碼內部,永遠不會改變。
6.非RAM儲存。若資料完全獨立於一個程式之外,則程式不運行時仍可存在,並在程式的控制範圍之內。例如,流式對象和固定對象。
二、對象
對象的三個主要特性:
•對象的行為——可以對對象施加哪些操作,或可以對對象施加哪些方法?
•對象的狀態——當時加那些方法時,對象如何響應?
•對象標識——如何辨別具有相同行為與狀態的不同對象?
對象的行為是由可調用的方法定義的。每個對象都儲存著描述當前特徵的資訊,這就是對象的狀態。對象的狀態不會自發改變。一個設計良好的類,它的對象只能通過調用方法實現,如果不經過方法調用就可以改變對象的狀態,說明封裝性受到了破壞。
封裝:將資料和行為組合在一個包中,並對對象的使用者隱藏了資料的實現方法。封裝的關鍵在於絕對不能讓類中的方法直接地訪問其他類的執行個體域。程式僅通過對象的方法域對象資料進行互動。
對象中的資料稱為執行個體域(instance field)或屬性。操縱資料的過程稱為方法(method)。對於每個特定的對象都有一組特定的執行個體域值(屬性值),這些值的集合就是該對象的目前狀態。
類之間的關係
類之間常見的關係:
•依賴(“use-a”): 一個類的方法操縱另一個類的對象。
•彙總(“has-a”): 一個類的對象包含另一個類的對象。
•繼承(“is-a”): 用於表示特殊與一般的關係。如果類A擴充類B(A繼承B),類A不但包含類B的方法,還有擴充的方法。
一個對象並沒有實際包含一個對象,而僅僅引用一個對象。
在Java中,任何物件變數的值都是都是對儲存在另外一個地方的一個對象的引用。new操作符的傳回值也是一個引用。
以上這篇全面理解Java類和對象就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支援雲棲社區。