JAVA面向物件三大特徵之封裝
阿新 • • 發佈:2020-11-01
目錄
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;
}
}
注意事項
- 如果你不提供構造方法,系統會給出無引數構造方法。
- 如果你提供了構造方法,系統將不再提供無引數構造方法。
- 構造方法是可以過載的,既可以定義引數,也可以不定義引數。