首頁 > Java > java教程 > 主體

全面理解Java類別和對象

高洛峰
發布: 2017-01-20 17:47:10
原創
1161 人瀏覽過

物件導向的程式是由物件組成的,每個物件包含對使用者公開的特定功能部分和隱藏的實作部分。在物件導向程式設計(OOP)中,不必關心物件的具體實作。在傳統的結構化程式設計中,演算法是第一位的,資料結構是第二位的,即首先確定如何操作數,再考慮如何組織數據,以方便操作。而OOP則顛倒了這個次序,將資料放在第一位,然後再考慮操作資料的演算法。

一、類別

類別是建構物件的模板和藍圖。通俗地說,類相當於建築的圖紙,而對象相當於建築物。由類別建構物件的過程稱為創建物件的實例。

Java中透過關鍵字class定義“類別”,後面跟著類別名稱。例如:

class Person{
  // 类的主体内容
}
登入後複製

定義了一個Person類別。

1.字段和方法

定義一個類別時,可以在類別裡設定兩種類型的元素:資料成員和成員函數。其中資料成員是一種對象,可以是任何類型。如果是指向物件的句柄,則必須初始化這個句柄,透過建構器與一個實際物件連接起來。如果是基本資料類型,則可以在類別定義的位置直接初始化。

每個物件都為自己的資料成員保有儲存空間;資料成員不會在物件之間共用。

class Person{
  String name;
  double salary;
}
登入後複製


透過new關鍵字建立一個物件。如:

Person p = new Person();
登入後複製


(1)主成員的預設值

某個主資料類型屬於一個類別成員,那麼即是不明確進行初始化,也可以保證他們獲得一個預設值。

全面理解Java類別和對象

如果一個變數作為類別的成員變量,那麼對於主類型一定會被初始化,要特別注意初始化的值。對於局部變數則會得到一些隨機值,如:int x;不會自動初始化為0。

(2)方法

方法的基本組成部分包括名字、自變數、返回類型以及主體。方法的基本形式為:

回傳型別 方法名稱(/*自變數清單*/) {/* 方法體 */}

傳回型別是指呼叫方法之後傳回的數值型別。方法名是對具體方法的標識和引用。自變數清單列出****了想傳遞給方法的資訊類型和名稱。

在Java中方法的呼叫形式為物件名稱.方法名稱

1. 用句柄操作物件

儘管Java是完全物件導向的。但是,操作的標識符實際上指向一個物件的“句柄”,又稱為“引用”。句柄是可以獨立存在的,並不是說,擁有一個句柄就必須有一個物件與之對應。例如,int i;定義了一個整數變數i,並不表示它一定有值。如,建立一個String類型的句柄:

String s;
登入後複製


這裡只是建立了句柄,並沒有建立物件。由於s並沒有與之關聯的對象,如果呼叫s將出現異常。所以,創建時需要進行初始化。

String s = "hello";
登入後複製


在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類和物件就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持PHP中文網。

更多全面理解Java類別和物件相關文章請關注PHP中文網!

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
最新問題
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板