1. 程式人生 > >【java】面向物件程式設計——類與物件的封裝

【java】面向物件程式設計——類與物件的封裝

Java比C更方便的地方在於Java是面向物件的。面向物件的特徵:
1、封裝 ; 2、繼承 ; 3、多型;
以下對面向物件的封裝特徵進行簡述:

一、類與物件的定義與使用

類是指共性的概念,物件是一個具體的、可以使用的事物。
首先產生類,而後才可以產生物件。

類的組成:
	1. 方法(操作的行為)
	2. 屬性(變數,描述每個物件的具體特點)
類的定義:
class 類名稱 {    
	屬性1;    
	屬性2;  
	屬性n...;    
	構造方法(){}    
	方法1(){}    
	方法2(){}    
	方法n(){}...
 }
物件的定義:
類名稱 物件名稱 = new 類名稱();

注:
1、引用資料型別在類中作為屬性建立物件時預設值是null。
2、類中的屬性定義為private時,不能通過外部來訪問。

物件記憶體分析:

我們可以簡單的將Java中的記憶體分為兩部分:堆記憶體和棧記憶體。
棧記憶體中一般存放基本資料型別、物件引用(堆記憶體的地址)。
堆記憶體中一般存放資料(物件的屬性資訊)。

下面通過如下程式碼對記憶體進行分析:

class Person{    
	String name;    
	int age;    
} 
public class Test{    
	public
static void main(String[] args) { Person per = new Person(); per.name = "張三" ; per.age = 18 ; } }

只要出現了new,就表明在堆上建立並開闢了一個類的物件引用這部分記憶體。
所以main方法中的第一行程式碼表明在堆上分配了記憶體並且產生了Person類的物件per引用這部分記憶體。圖如下:
在這裡插入圖片描述
第二、三行語句通過per設定堆中屬性值,如下圖:
在這裡插入圖片描述
注:
1、通過物件設定堆中屬性值。
2、物件必須例項化後再使用。

引用傳遞分析:

(過程同陣列中引用傳遞分析)


二、封裝和構造方法

private對屬性進行了封裝,要訪問私有屬性,按照Java的設計原則必須提供以下兩種方法:

setter方法:主要用於進行屬性內容的設定與修改
getter方法:主要用於屬性內容的取得

如果屬性的資料型別是boolean,建議使用isXXX格式來起名。
類的設計原則:

  1. 編寫類時,類中的所有屬性必須使用private封裝。
  2. 屬性若要被外部訪問,必須定義setter、getter方法。
構造方法:

構造方法就是使用關鍵字new例項化新物件時來進行呼叫的操作方法。對於構造方法的定義,也需要遵循以下原則:

  1. 方法名稱必須與類名稱相同
  2. 構造方法沒有返回值型別宣告
  3. 每一個類中一定至少存在一個構造方法(沒有明確定義,則系統自動生成一個無參構造)

思考題:構造方法無返回值,為什麼沒有void宣告?
原因如下:

  1. 屬性是在物件開闢堆記憶體時開闢的空間
  2. 構造方法是在使用new後呼叫的
  3. 普通方法是在空間開闢了、構造方法執行之後可以多次呼叫的

因此,編譯器是根據程式結構來區分普通方法與構造方法的,所以在構造方法前沒有返回值型別宣告。

構造引數過載

多個構造方法,按照引數的升序或降序。

匿名物件

一個物件沒有起名字,這個物件叫匿名物件。
由於匿名物件不會有任何的棧空間所指向,所以使用一次後就成為垃圾空間。


三、this關鍵字

呼叫本類屬性

只要在類中方法訪問類中屬性,一定要加this關鍵字。

呼叫本類方法
  1. 呼叫普通方法:this.方法名稱(引數)
  2. 呼叫構造方法:this(引數)

在java中,支援構造引數相互呼叫。
使用this呼叫構造方法時請注意:

  1. this呼叫構造方法的語句必須在構造方法首行
  2. 使用this呼叫構造方法時,請留有出口
  3. 構造方法中通過this呼叫本類的構造方法要放到構造方法的第一行程式碼
this表示當前物件

只要物件呼叫了本類中的方法,這個this就表示當前執行的物件。
訪問當前物件的屬性的時候,要加上this。


四、static關鍵字

static可以修飾成員變數、方法、程式碼塊、內部類。

static類屬性

static建立的屬性,成為類屬性,儲存在全域性資料區的記憶體之中,所有物件都可以進行該資料區的訪問。(一個物件把它改了之後,其餘的物件顯示的也是改過之後的屬性)訪問時通過類名直接使用,不建議使用this。
結論:

  1. 訪問static屬性(類屬性)應使用類名稱.屬性名
  2. 所有的非static屬性(例項變數)必須在物件例項化後使用,而static屬性(類屬性)不受物件例項化控制。
static類方法(靜態方法)

使用static定義的方法,直接通過類名稱訪問。
說明:

  1. 所有的static方法不允許呼叫非static定義的屬性或方法。(如果要呼叫,可以在該方法中通過建立一個物件來呼叫)
  2. 所有的非static方法允許訪問static方法或屬性。

使用static定義方法只有一個目的:
某些方法不希望受到物件的控制,即可以在沒有例項化物件的時候執行(廣泛 存在於工具類中)。
main方法也是一個普通的靜態方法,可以自己呼叫自己,可以被呼叫。
main方法為什麼要定義成靜態的?
如果定義成動態的,在使用時要有一個物件才能呼叫,定義成靜態的,可以在沒有物件的時候執行。