靈雪的java修煉之路day07

xfajll發表於2020-11-17

day07

類與物件

	#### 	什麼是類
  • ​ 類:是一組相關【屬性】和【行為】的集合。可以把類看成一類事物的模板,使用事物的屬性特徵和行為特徵來描述該類事物。

  • ​ 現實中,描述一類事物:

    ​ 屬性:描述該類事物的一種【狀態】資訊。

    ​ 行為:描述該類事物具備的功能,能夠做什麼。

    什麼是物件

    • ​ 物件:就是一類事物的具體的體現。物件是類的一個【例項】,必然具備該類事物的屬性特徵和行為特徵。

      類與物件的關係
      • ​ 類是對一類事物的描述,是【抽象的】。
      • ​ 物件是一類事物的例項,是【具體的】。
      • ​ 類是物件的模板,物件是類的實體。

類的定義

	#####      事物與類的對比

​ 現實中的一類事物:

​ 屬性:事物的狀態資訊

​ 行為:事物能夠做什麼,具備的功能

​ Java中的類描述事物也是如此:

​ 成員變數:對應事物的屬性

​ 成員方法:對應事物的行為

類的定義格式:
	public class ClassName {
        // 成員變數
        // 成員方法
    }
  • ​ 定義類:定義類的成員,包括成員變數和成員方法
  • ​ 成員變數:和之前定義變數的格式一模一樣,只不過【位置】不同,成員變數定義在類中,方法外
  • ​ 成員方法:和之前定義的方法幾乎是一樣的,只不過去掉【static】。

物件的使用

	##### 	物件的使用格式:

	  物件建立的格式:
		類名  物件名 = new 類名();

使用物件訪問類的成員資訊:

		物件名.成員變數名;
         物件名.成員方法();

成員變數的預設值

資料型別預設值
整數(byte short int long)0
基本型別浮點型別(float double)0.0
字元型(char)‘\u0000’
布林型別(boolean)false
引用型別陣列、類、介面null

備註:方法內定義的變數沒有初始化,不能被使用。

​ 如果成員變數沒有進行賦值,系統會自動給一個預設值,規則和陣列一樣的。

類與物件的練習

​ 定義一個類,用來模擬"手機"事物,屬性:品牌、價格、顏色;行為:打電話、開關機、群發簡訊。

​ 測試訪問手機的屬性和行為

物件的記憶體圖解

​ 一個物件,呼叫一個方法記憶體圖解

備註:在棧記憶體當中執行的方法,遵循“先進後出,後進先出”的原則,此時變數phone指向堆記憶體當中的空間,尋找方法資訊,執行該方法。

兩個物件,呼叫同一個方法記憶體圖解

​ 物件呼叫方法時,根據物件當中方法標記(地址值),去類中尋找方法資訊,這樣哪怕是多個物件,方法資訊只儲存一份,節約記憶體空間。

成員變數和區域性變數的區別

​ 變數根據定義的【位置不同】,我們給變數起了不同的名字

public class People {
    
    String name = "小明";// 成員變數  
    public void eat() {
        String food = "雞蛋撈麵";// 區域性變數 
        System.out.println(name + "中午吃的是:" + food);
    }
    
}
  • 在類中定義的位置不同 【重點】

    成員變數:類中、方法外

    區域性變數:方法中或者方法宣告上(形式引數)

  • 作用範圍不同 【重點】

    成員變數:類中

    區域性變數:方法中

  • 初始值不同 【重點】

    成員變數:有預設值

    區域性變數:沒有預設值,必須先定義賦值,才能使用

  • 在記憶體當中儲存的位置不同 【瞭解】

    成員變數:堆記憶體當中

    區域性變數:棧記憶體當中

  • 生命週期不同 【瞭解】

    成員變數:隨著物件的建立而存在,隨著物件的消失而消失

    區域性變數:隨著方法的呼叫而存在,隨著方法呼叫結束而消失。

  • 修飾符不同 【瞭解】

    成員變數:可以使用修飾符

    區域性變數:不可以使用修飾符

封裝

	####    封裝概述

​ 概述

​ 物件導向程式語言模擬客觀世界,客觀世界裡的成員變數都是隱藏在物件內部的,外界無法直接操作和修改。封裝可以認為是一個保護屏障,防止該類的程式碼和資料被其他類隨意訪問和修改。要訪問該類的資料,必須要通過指定的方式才可以。適當的封裝,可以讓我們的程式碼更容易維護和理解,也加強了程式碼的安全性。

​ 原則

​ 將【屬性隱藏】起來,如果想要訪問類中的某個屬性,提供【公共的方法】對其訪問。

封裝步驟

	 1. 使用【private】關鍵字來修飾成員變數

  		 2. 對需要訪問的成員變數,提供對應的一對 getXxx方法和setXxx方法。

封裝的操作----private關鍵字

	##### 	private的含義
  1. ​ private是一個許可權修飾符,代表最小許可權

  2. ​ 可以修飾成員變數,也可以修飾成員方法

  3. ​ 被private修飾後的成員變數和成員方法,只能在本類中訪問。

private使用格式

private  資料型別  變數名;
public class Man {
   // 1.使用private關鍵字修飾成員變數 
   private String name;
   private int age;
   // 2.提供對應的getXxx方法和setXxx方法,可以訪問類中的成員變數
   // getXxx 獲取類中的成員變數值 
   public  String getName() {
       return name;
   }
   // setXxx 設定類中的成員變數值
   public void setName(String name) {
       name = name;
   } 
   // 提供age的getXxx方法和setXxx方法
   public int getAge() {
       return age;
   } 
   public void setAge(int age) {
       age = age;
   }      
}

封裝優化1 ---- this關鍵字

​ 我們發現setXxx()方法當中形參名字不符合我們識別符號的命名規範–見名知意,如果修改成和成員變數名字相同,會觸發Java程式當中的就近原則,會把方法內的變數統統設定為形參變數,會導致賦值失敗。我們可以採用【this】關鍵字 來解決變數重名問題。

this的含義

​ this代表所在類的當前物件的引用(地址值),即物件對自己的引用。

​ 備註:意思方法被哪個物件呼叫,方法中的this就代表那個物件。即誰呼叫,this就是誰。

this的使用格式
this.成員變數名

使用this關鍵字修飾方法當中的成員變數,解決成員變數被隱藏的問題:

public class Man {
     // 1.使用private關鍵字修飾成員變數 
   private String name;
   private int age;
   // 2.提供對應的getXxx方法和setXxx方法,可以訪問類中的成員變數
   // getXxx 獲取類中的成員變數值 
   public  String getName() {
       return name;
   }
   // setXxx 設定類中的成員變數值
   public void setName(String name) {
       this.name = name;
   } 
   // 提供age的getXxx方法和setXxx方法
   public int getAge() {
       return age;
   } 
   public void setAge(int age) {
       this.age = age;
   }      
}

備註:方法當中只有一個變數名,預設也是使用this修飾,可以省略不寫。

封裝優化2-----構造方法

​ 當一個物件被建立出來的時候,構造方法用來初始化物件,給物件的成員變數賦初始值。

備註:無論你是否在類中定義構造方法,當類被定義出來的時候,系統會自動給該類分配一個構造方法—無參的構造方 法,一旦在類中顯式的定義構造方法,Java自動提供的預設無參構造方法就會失效(被收回)。

構造方法的定義格式
 修飾符  構造方法名(引數列表) {
     // 方法體內容
 }
// 構造方法沒有返回值,構造方法名和類名完全一致,不需要void。

練習構造方法的使用

public class Dog {
    
    private String name;
    private int age;
    private String brand;
    private String color;
    // 優化封裝 使用構造方法
    public Dog(String name,String brand,int age,String color) {
        // 方法體內容
        this.name = name;
        this.brand = brand;
        this.age = age;
        this.color = color;
    }
    // Java提供的預設的無參構造方法
    //public Dog() {
        
    //}
    
}

練習 Person類,成員變數:性別、年齡、體重、民族、姓名,定義Person類的構造方法,無參構造方法、全參構造方法。例項化並對類中的成員變數賦初始值。

注意事項

  • ​ 構造方法名稱必須和所在的類名完全一樣,就連大小寫一樣
  • ​ 構造方法不用宣告返回值型別,連void也不需要
  • ​ 構造方法不能用return一個具體的返回值。
  • ​ 如果定義類時沒有顯式定義構造方法,系統會提供一個預設的無參構造方法
  • ​ 一旦自定義了一個構造方法,那麼編譯器將會收回預設提供的構造方法
  • ​ 構造方法可以過載:方法名稱相同,引數列表不同

標準類-------JavaBean

​ JavaBean是Java語言編寫類的一種標準規範。符合JavaBean的類,包含四部分:

  • ​ 所有的成員變數都要使用private關鍵字修飾

  • ​ 要為每一個成員變數提供一對公共的getXxx和setXxx方法

  • ​ 編寫一個無參的構造方法

  • ​ 最好再提供一個全參的構造方法。

    這樣標準的類就叫做Java Bean

練習JavaBean類的定義 要求如下:

​ 定義一個電腦筆記本類

​ 成員變數:品牌、價格、廠商、生產地址、顏色

相關文章