1. 程式人生 > 實用技巧 >JAVA面向物件三大特徵之封裝

JAVA面向物件三大特徵之封裝

目錄

1. 面向物件思想概述

Java語言是一種面向物件的程式設計語言,而面向物件思想是一種程式設計思想,我們在面向物件思想的指引下, 使用Java語言去設計、開發計算機程式。 這裡的物件泛指現實中一切事物,每種事物都具備自己的屬性和行為。面 向物件思想就是在計算機程式設計過程中,參照現實中事物,將事物的屬性特徵、行為特徵抽象出來,描述成計算 機事件的設計思想。 它區別於面向過程思想,強調的是通過呼叫物件的行為來實現功能,而不是自己一步一步的去 操作實現。

舉個例子:打掃衛生

  • 面向過程:擦玻璃-->掃地-->拖地-->倒垃圾。
  • 面向物件:叫來保潔員->保潔員打掃衛生。

特點:

  • 面向過程:強調的是我該怎麼做,然後按步驟一步步的完成。
  • 面向物件:強調的是該讓誰來做,怎麼做就是物件的事情,這裡的物件指的是保潔員。

面向物件和麵向過程的區別:

  • 面向過程面向過程效能比面向物件高。 因為類呼叫時需要例項化,開銷比較大,比較消耗資源,所以當效能是最重要的考量因素的時候,比如微控制器、嵌入式開發、Linux/Unix 等一般採用面向過程開發。但是,面向過程沒有面向物件易維護、易複用、易擴充套件。
  • 面向物件面向物件易維護、易複用、易擴充套件。
    因為面向物件有封裝、繼承、多型性的特性,所以可以設計出低耦合的系統,使系統更加靈活、更加易於維護。但是,面向物件效能比面向過程低

2. 類和物件

面向物件的程式是由類和物件組成的,每個物件都包含對使用者公開的特定功能部分和隱藏的實現部分。

什麼是類和物件呢?我們看下概念:

  • :是一組相關屬性和行為的集合。可以看成是一類事物的模板,使用事物的屬性特徵和行為特徵來描述該 類事物。
  • 物件:是一類事物的具體體現。物件是類的一個例項,必然具備該類事物的屬性和行為。

在JAVA中,類的定義格式為:

public class ClassName {
//成員變數
//成員方法
}
  • 定義類:就是定義類的成員,包括成員變數和成員方法。
  • 成員變數:和以前定義變數幾乎是一樣的。只不過位置發生了改變。在類中,方法外。
  • 成員方法:和以前定義方法幾乎是一樣的。

以保潔員為例定義一個類

public class Cleaner {
    //成員變數
    String name;//姓名
    int age;//年齡
    //成員方法
    //打掃衛生的方法
    publicvoid clean() {
    	System.out.println("清潔衛生");
    }
   
}

物件的使用格式為:

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

建立一個姓名為張三的保潔員物件

public static void main(String[] args) {
    //建立物件格式:類名 物件名 = new 類名();
    Cleaner c = new Cleaner();
    //直接輸出成員變數值
    System.out.println("姓名:"+c.name); //null
    System.out.println("年齡:"+c.age); //0
    System.out.println("‐‐‐‐‐‐‐‐‐‐");
    //給成員變數賦值
    c.name = "張三";
    c.age = 18;
    //再次輸出成員變數的值
    System.out.println("姓名:"+c.name); //張三
    System.out.println("年齡:"+c.age); //18
    System.out.println("‐‐‐‐‐‐‐‐‐‐");
    //呼叫成員方法
    s.clean(); // "清潔衛生"
}

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

3. 封裝

3.1 封裝概述

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

3.2 封裝的原則

將屬性隱藏起來,若需要訪問某個屬性,提供公共方法對其訪問。

3.3 封裝的步驟

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

以保潔員為例,程式碼如下:

public class Cleaner {
    //成員變數
    private String name;//姓名
    private int age;//年齡
}

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

public class Cleaner {
    private String name;
    private int age;
    public void setName(String name) {
    	this.name = name;
    }
    public String getName() {
    	return this.name;
    }
    public void setAge(int age) {
    	this.age = age;
    }
    public int getAge() {
   		return this.age;
    }
}

3.4 封裝的優化——構造方法

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

構造方法的定義格式

修飾符 構造方法名(引數列表){
	// 方法體
}

以保潔員類為例,定義構造方法

public class Cleaner {
    private String name;
    private int age;
    // 無引數構造方法
    public Cleaner() {}
    // 有引數構造方法
    public Cleaner(String name,int age) {
        this.name = name;
        this.age = age;
    }

    public void setName(String name) {
    	this.name = name;
    }
    public String getName() {
    	return this.name;
    }
    public void setAge(int age) {
    	this.age = age;
    }
    public int getAge() {
   		return this.age;
    }
}

注意事項

  1. 如果你不提供構造方法,系統會給出無引數構造方法。
  2. 如果你提供了構造方法,系統將不再提供無引數構造方法。
  3. 構造方法是可以過載的,既可以定義引數,也可以不定義引數。