JAVA三大特性之 封裝
阿新 • • 發佈:2018-11-14
我們日常使用的電腦主機,把cpu、記憶體、主機板等等都封裝到機箱裡面去。假如沒有機箱的話的出現什麼問題,主機、主機板全部都散落在一處,然後開機沒有開機按鈕,那麼需要我們直接操作接跳線才能把電腦開啟。這樣子的話假如操作不慎的話,會讓機器損壞危險,那麼假如用機箱封裝起來的話,那麼就不需要這樣子做了。體現了封裝的---安全特性。
你拿電腦去加記憶體,可以直接給電腦給維修的人,等他加好記憶體了之後。你拿到的還是那個機箱,裡面發生了怎樣子的變化你並不知道。封裝的第二個好處-將變化隔離。
在機箱裡面提供一個開機按鈕,而不需要你直接使用跳線開機的話,體現了封裝的—便於使用的特性。
只要機箱提供了一個開機的功能,然後無論這個機箱拿到哪裡去,都可以使用這個開機的功能.體現了封裝的---提供重複性的特性。
沒有封裝的情況:
模擬問題
- 描述Employee類。定義姓名,工號,性別的成員變數,和工作的方法。成員使用public修飾。
- 建立Employee物件,物件.成員的方式進行賦值。最後該物件呼叫工作方法。
- 總結:如果不使用封裝,很容易賦值錯誤,並且任何人都可以更改,造成資訊的 不安全。
- 問題解決:使用封裝
public class EmployeeDemo { public static void main(String[] args) { // 建立物件 Employee jack = new Employee(); // 進位制通過類名.成員的形式呼叫成員。初始化例項變數 jack.name = "jack"; jack.id = "123456"; jack.gender = "男"; // 呼叫成員方法 jack.work(); System.out.println(); // 傳入非法的引數 jack.gender = "不是男人"; jack.work(); } } class Employee { String name; String id; String gender; public void work() { System.out.println(id + ":" + name + ":" + gender + " 努力工作中!!!"); } }
使用封裝
package oop01; public class EmployeeDemo { public static void main(String[] args) { // 建立物件 Employee jack = new Employee(); //編譯報錯 jack.name = "jack"; jack.id = "123456"; jack.gender = "男"; // 編譯報錯 jack.gender = "不是男人"; jack.work(); } } class Employee { //使用了private修飾了成員變數 private String name; private String id; private String gender; public void work() { System.out.println(id + ":" + name + ":" + gender + " 努力工作中!!!"); } } 問題: 1:為什麼之前可以通過物件名.屬性名的方式訪問? 2:public 成員修飾符,公共的誰都可以訪問。 3:private 成員修飾符,私有的,只有自己可以訪問。 2:修改Employee類 性別的修飾符修改為private 1:編譯不通過 2:private修飾的成員在自己所在的類中可以使用,在類外邊不可以使用。 3:Employee類的gender的修飾符修改為private後,無法再類外呼叫,那麼如何給gender設定值? 1:對外提供公開的用於設定物件屬性的public方法 1:設定set 2:獲取get 2:在set方法中加入邏輯判斷,過濾掉非法資料。 3:將所有的成員變數封裝加上private,提供get、set方法 package oop01; public class EmployeeDemo { public static void main(String[] args) { // 建立物件 Employee jack = new Employee(); // 呼叫公有方法,給成員變數賦值。 jack.setId("007"); jack.setName("jack"); jack.setGender("男xx"); // 獲取例項變數的值 System.out.println(jack.getGender()); System.out.println(jack.getId()); System.out.println(jack.getName()); // 呼叫成員方法 jack.work(); } } class Employee { private String name; private String id; private String gender; // 提供公有的get set方法 public String getName() { return name; } public void setName(String n) { name = n; } public String getId() { return id; } public void setId(String i) { id = i; } public String getGender() { return gender; } public void setGender(String gen) { if ("男".equals(gen) || "女".equals(gen)) { gender = gen; } else { System.out.println("請輸入\"男\"或者\"女\""); } } public void work() { System.out.println(id + ":" + name + ":" + gender + " 努力工作中!!!"); } }