面向對象的程序是由對象組成的,每個對象包含對用戶公開的特定功能部分和隱藏的實現部分。在面向對象程序設計(OOP)中,不必關心對象的具體實現。在傳統的結構化程序設計中,算法是第一位的,數據結構是第二位的,即首先確定如何操作數,再考慮如何組織數據,以方便操作。而OOP則顛倒了這種次序,將數據放在第一位,然后再考慮操作數據的算法。
一、類
類是構造對象的模板和藍圖。通俗地說,類相當于建筑的圖紙,而對象相當于建筑物。由類構造對象的過程稱為創建對象的實例。
Java中通過關鍵字class定義“類”,后跟類名。例如:
1
2
3
|
class Person{ // 類的主體內容 } |
定義了一個Person類。
1.字段和方法
定義一個類時,可以在類里設置兩種類型的元素:數據成員和成員函數。其中數據成員是一種對象,可以是任何類型。如果是指向對象的句柄,則必須初始化這個句柄,通過構造器與一個實際對象連接起來。如果是基本數據類型,則可以在類定義的位置直接初始化。
每個對象都為自己的數據成員保有存儲空間;數據成員不會在對象之間共享。
1
2
3
4
|
class Person{ String name; double salary; } |
通過new
關鍵字創建一個對象。如:
1
|
Person p = new Person(); |
(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類型的句柄:
1
|
String s; |
這里只是創建了句柄,并沒有創建對象。由于s并沒有與之關聯的對象,如果調用s將出現異常。所以,創建時需要進行初始化。
1
|
String s = "hello" ; |
在Java中,通過new關鍵字創建對象,它將返回對象的引用(即句柄)。所以
1
|
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類和對象就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持服務器之家。