天天看點

【JavaSe】面向對象篇(二) 類與對象 JavaSe·面向對象篇(二) 類與對象

JavaSe·面向對象篇(二) 類與對象

1. 類與對象概念

環顧周圍,你會發現很多對象,比如桌子,椅子,同學,老師等。桌椅屬于辦公用品,師生都是人類。那麼什麼是類呢?什麼是對象呢?

1.1 什麼是類

  • 類: 是一組相關屬性和行為的集合。可以看成是一類事物的模闆,使用事物的屬性特征和行為特征來描述該類事物。

現實中,描述一類事物:

  • 屬性:就是該事物的狀态資訊。
  • 行為:就是該事物能夠做什麼。
舉例: 貓
  • 屬性:名字、體重、年齡、顔色
  • 行為:走、跑、叫

1.2 什麼是對象

  • 對象:是一類事物的具體展現。對象是類的一個執行個體,必然具備該類事物的屬性

    和行為。

現實中,一類事物的一個執行個體

舉例:一隻貓。
  • 屬性:tom、5kg、2 years、black
  • 行為:偷偷溜走、跳着跑、喵

1.3 類與對象的關系

  1. 類是對一類事物的描述,是抽象的。
  2. 對象是一類事物的執行個體,是具體的。
  3. 類是對象的模闆,對象是類的實體。
    【JavaSe】面向對象篇(二) 類與對象 JavaSe·面向對象篇(二) 類與對象

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 一個對象,調用一個方法記憶體圖

【JavaSe】面向對象篇(二) 類與對象 JavaSe·面向對象篇(二) 類與對象

通過上圖,我們可以了解,在棧記憶體中運作的方法,遵循"先進後出,後進先出"的原則。變量p指向堆記憶體中的空間,尋找方法資訊,去執行該方法。

但是,這裡依然有問題存在。建立多個對象時,如果每個對象内部都儲存一份方法資訊,這就非常浪費記憶體了,因為所有對象的方法資訊都是一樣的。那麼如何解決這個問題呢?請看如下圖解

4.2 兩個對象,調用同一方法記憶體圖

【JavaSe】面向對象篇(二) 類與對象 JavaSe·面向對象篇(二) 類與對象

對象調用方法時,根據對象中方法标記(位址值),去類中尋找方法資訊。這樣哪怕是多個對象,方法資訊隻儲存一份,節約記憶體空間。

4.3 兩個引用指向同一個對象的記憶體圖

【JavaSe】面向對象篇(二) 類與對象 JavaSe·面向對象篇(二) 類與對象

兩個引用指向同一個對象時,那麼兩個引用的操作都是在操作一個對象。

4.4 使用對象類型作為方法的參數

【JavaSe】面向對象篇(二) 類與對象 JavaSe·面向對象篇(二) 類與對象

當一個對象作為參數,傳遞到方法中時,實際上傳遞進去的是對象位址值。

4.5 使用對象類型作為方法的傳回值

【JavaSe】面向對象篇(二) 類與對象 JavaSe·面向對象篇(二) 類與對象

同樣,對象作為傳回值時,傳回的也是對象的位址值

5. 成員變量與局部周遊的差別

變量根據定義位置的不同,我們給變量起了不同的名字。如下圖所示:

【JavaSe】面向對象篇(二) 類與對象 JavaSe·面向對象篇(二) 類與對象
  1. 在類中的位置不同

    ⚪ 成員變量:類中,方法外

    ⚪ 局部變量:方法中或者方法聲明上(形式參數)

  2. 作用範圍不一樣

    ⚪ 成員變量:類中

    ⚪ 局部變量:方法中

  3. 初始化值的不同

    ⚪ 成員變量:有預設值

    ⚪ 局部變量:沒有預設值。必須先定義,指派,最後使用

  4. 在記憶體中的位置不同

    ⚪ 成員變量:堆記憶體

    ⚪ 局部變量:棧記憶體

  5. 生命周期不同

    ⚪ 成員變量:随着對象的建立而存在,随着對象的消失而消失

    ⚪ 局部變量:随着方法的調用而存在,随着方法的調用完畢而消失

繼續閱讀