JavaSe·面向對象篇(二) 類與對象
1. 類與對象概念
環顧周圍,你會發現很多對象,比如桌子,椅子,同學,老師等。桌椅屬于辦公用品,師生都是人類。那麼什麼是類呢?什麼是對象呢?
1.1 什麼是類
- 類: 是一組相關屬性和行為的集合。可以看成是一類事物的模闆,使用事物的屬性特征和行為特征來描述該類事物。
現實中,描述一類事物:
- 屬性:就是該事物的狀态資訊。
- 行為:就是該事物能夠做什麼。
舉例: 貓
- 屬性:名字、體重、年齡、顔色
- 行為:走、跑、叫
1.2 什麼是對象
-
對象:是一類事物的具體展現。對象是類的一個執行個體,必然具備該類事物的屬性
和行為。
現實中,一類事物的一個執行個體
舉例:一隻貓。
- 屬性:tom、5kg、2 years、black
- 行為:偷偷溜走、跳着跑、喵
1.3 類與對象的關系
- 類是對一類事物的描述,是抽象的。
- 對象是一類事物的執行個體,是具體的。
- 類是對象的模闆,對象是類的實體。
2. 類的定義
2.1 事物與類的對比
現實世界的一類事物:
- 屬性:事物的狀态資訊
- 行為:事物能夠做什麼
Java中用class描述事物也是如此:
- 成員變量:對應事物的屬性
- 成員方法:對應事物的行為
2.2 類的定義格式
public class ClassName {
//成員變量
//成員方法
}
- 定義類:就是定義類的成員,包括成員變量和成員方法。
- 成員變量:和以前定義變量幾乎是一樣的。隻不過位置發生了改變。在類中,方法外。
- 成員方法:和以前定義方法幾乎是一樣的。隻不過把static去掉,static的作用在面向對象後面課程中再詳細講解。
舉例:
public class Cat {
//成員變量
String name;//姓名
int age;//年齡
//成員方法
//學習的方法
publicvoid work() {
System.out.println("偷偷溜走");
}
//吃飯的方法
publicvoid run() {
System.out.println("跳着跑");
}
}
3. 對象的使用
3.1 建立對象
類名 對象名 = new 類名();
3.2 使用對象通路類中的成員
對象名.成員變量;
對象名.成員方法();
3.3 對象的使用格式舉例
public static void main(String[] args) {
//建立對象格式:類名 對象名 = new 類名();
Cat s = new Cat();
System.out.println("s:"+s); //[email protected]
//直接輸出成員變量值
System.out.println("姓名:" + s.name); //null
System.out.println("年齡:" + s.age); //0
System.out.println("‐‐‐‐‐‐‐‐‐‐");
//給成員變量指派
s.name = "Tom";
s.age = 2;
//再次輸出成員變量的值
System.out.println("姓名:" + s.name); //Tom
System.out.println("年齡:" + s.age); //2
System.out.println("‐‐‐‐‐‐‐‐‐‐");
//調用成員方法
s.work(); // "偷偷溜走"
s.run(); // "跳着跑"
}
3.4 成員變量的預設值
資料類型 | 預設值 | |
---|---|---|
基本類型 | 整數(byte,short,int,long) | |
浮點數(float,double) | 0.0 | |
字元(char) | ‘\u0000’ | |
布爾(boolean) | false | |
引用類型 | 數組,類,接口 | null |
4. 對象記憶體圖
4.1 一個對象,調用一個方法記憶體圖
通過上圖,我們可以了解,在棧記憶體中運作的方法,遵循"先進後出,後進先出"的原則。變量p指向堆記憶體中的空間,尋找方法資訊,去執行該方法。
但是,這裡依然有問題存在。建立多個對象時,如果每個對象内部都儲存一份方法資訊,這就非常浪費記憶體了,因為所有對象的方法資訊都是一樣的。那麼如何解決這個問題呢?請看如下圖解
4.2 兩個對象,調用同一方法記憶體圖
對象調用方法時,根據對象中方法标記(位址值),去類中尋找方法資訊。這樣哪怕是多個對象,方法資訊隻儲存一份,節約記憶體空間。
4.3 兩個引用指向同一個對象的記憶體圖
兩個引用指向同一個對象時,那麼兩個引用的操作都是在操作一個對象。
4.4 使用對象類型作為方法的參數
當一個對象作為參數,傳遞到方法中時,實際上傳遞進去的是對象位址值。
4.5 使用對象類型作為方法的傳回值
同樣,對象作為傳回值時,傳回的也是對象的位址值
5. 成員變量與局部周遊的差別
變量根據定義位置的不同,我們給變量起了不同的名字。如下圖所示:
-
在類中的位置不同
⚪ 成員變量:類中,方法外
⚪ 局部變量:方法中或者方法聲明上(形式參數)
-
作用範圍不一樣
⚪ 成員變量:類中
⚪ 局部變量:方法中
-
初始化值的不同
⚪ 成員變量:有預設值
⚪ 局部變量:沒有預設值。必須先定義,指派,最後使用
-
在記憶體中的位置不同
⚪ 成員變量:堆記憶體
⚪ 局部變量:棧記憶體
-
生命周期不同
⚪ 成員變量:随着對象的建立而存在,随着對象的消失而消失
⚪ 局部變量:随着方法的調用而存在,随着方法的調用完畢而消失