【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格式來起名。
類的設計原則:
- 編寫類時,類中的所有屬性必須使用private封裝。
- 屬性若要被外部訪問,必須定義setter、getter方法。
構造方法:
構造方法就是使用關鍵字new例項化新物件時來進行呼叫的操作方法。對於構造方法的定義,也需要遵循以下原則:
- 方法名稱必須與類名稱相同
- 構造方法沒有返回值型別宣告
- 每一個類中一定至少存在一個構造方法(沒有明確定義,則系統自動生成一個無參構造)
思考題:構造方法無返回值,為什麼沒有void宣告?
原因如下:
- 屬性是在物件開闢堆記憶體時開闢的空間
- 構造方法是在使用new後呼叫的
- 普通方法是在空間開闢了、構造方法執行之後可以多次呼叫的
因此,編譯器是根據程式結構來區分普通方法與構造方法的,所以在構造方法前沒有返回值型別宣告。
構造引數過載
多個構造方法,按照引數的升序或降序。
匿名物件
一個物件沒有起名字,這個物件叫匿名物件。
由於匿名物件不會有任何的棧空間所指向,所以使用一次後就成為垃圾空間。
三、this關鍵字
呼叫本類屬性
只要在類中方法訪問類中屬性,一定要加this關鍵字。
呼叫本類方法
- 呼叫普通方法:this.方法名稱(引數)
- 呼叫構造方法:this(引數)
在java中,支援構造引數相互呼叫。
使用this呼叫構造方法時請注意:
- this呼叫構造方法的語句必須在構造方法首行
- 使用this呼叫構造方法時,請留有出口
- 構造方法中通過this呼叫本類的構造方法要放到構造方法的第一行程式碼
this表示當前物件
只要物件呼叫了本類中的方法,這個this就表示當前執行的物件。
訪問當前物件的屬性的時候,要加上this。
四、static關鍵字
static可以修飾成員變數、方法、程式碼塊、內部類。
static類屬性
static建立的屬性,成為類屬性,儲存在全域性資料區的記憶體之中,所有物件都可以進行該資料區的訪問。(一個物件把它改了之後,其餘的物件顯示的也是改過之後的屬性)訪問時通過類名直接使用,不建議使用this。
結論:
- 訪問static屬性(類屬性)應使用類名稱.屬性名
- 所有的非static屬性(例項變數)必須在物件例項化後使用,而static屬性(類屬性)不受物件例項化控制。
static類方法(靜態方法)
使用static定義的方法,直接通過類名稱訪問。
說明:
- 所有的static方法不允許呼叫非static定義的屬性或方法。(如果要呼叫,可以在該方法中通過建立一個物件來呼叫)
- 所有的非static方法允許訪問static方法或屬性。
使用static定義方法只有一個目的:
某些方法不希望受到物件的控制,即可以在沒有例項化物件的時候執行(廣泛 存在於工具類中)。
main方法也是一個普通的靜態方法,可以自己呼叫自己,可以被呼叫。
main方法為什麼要定義成靜態的?
如果定義成動態的,在使用時要有一個物件才能呼叫,定義成靜態的,可以在沒有物件的時候執行。