java 封裝
1 前言
我們日常使用的電腦主機,把cpu、內存、主板等等都封裝到機箱裏面去。假如沒有機箱的話的出現什麽問題,主機、主板全部都散落在一處,然後開機沒有開機按鈕,那麽需要我們直接操作接跳線才能把電腦開啟。這樣子的話假如操作不慎的話,會讓機器損壞危險,那麽假如用機箱封裝起來的話,那麽就不需要這樣子做了。體現了封裝的---安全特性。
你拿電腦去加內存,可以直接給電腦給維修的人,等他加好內存了之後。你拿到的還是那個機箱,裏面發生了怎樣子的變化你並不知道。封裝的第二個好處----將變化隔離。
在機箱裏面提供一個開機按鈕,而不需要你直接使用跳線開機的話,體現了封裝的---便於使用的特性。
只要機箱提供了一個開機的功能,然後無論這個機箱拿到哪裏去,都可以使用這個開機的功能
2 沒有封裝
模擬問題
- 描述Employee類。定義姓名,工號,性別的成員變量,和工作的方法。成員使用public修飾。
- 創建Employee對象,對象.成員的方式進行賦值。最後該對象調用工作方法。
- 總結:如果不使用封裝,很容易賦值錯誤,並且任何人都可以更改,造成信息的 不安全。
- 問題解決:使用封裝
package oop01; public class EmployeeDemo { public static void main(String[] args) { // 創建對象 Employee jack = newEmployee(); // 進制通過類名.成員的形式調用成員。初始化實例變量 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 + " 努力工作中!!!"); } }
3 封裝的實現
1:設置類的屬性為private(關鍵字),不能使用對象名.屬性名的方式直接訪問對象的屬性。
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 + " 努力工作中!!!"); } }
4 封裝的好處
1:隱藏了類的具體實現
2:操作簡單
3:提高對象數據的安全性
5 例子
練習:描述一個計算器類
/** Demo9描述一個計算器類。 */ // 0. 使用詞霸確定類名 class Calculator { // 1. 查看具體的計算器對象抽取所有計算器具有的共同屬性 public String name = "我的計算器我做主"; public double num1; public double num2; public char option; // 2. 查看具體的計算器對象抽取所有計算器具有的共同功能 // 2.1 定義接受數據的功能函數 public void init( double a , char op , double b ){ num1 = a; option = op; num2 = b; } // 2.2 定義計算的功能 public void calculate(){ switch ( option ) { case ‘+‘: System.out.println( name + " : " + num1 + " + " + num2 + " = " + ( num1 + num2 ) ); break; case ‘-‘: System.out.println( name + " : " + num1 + " - " + num2 + " = " + ( num1 - num2 ) ); break; case ‘*‘: System.out.println( name + " : " + num1 + " * " + num2 + " = " + ( num1 * num2 ) ); break; case ‘/‘: { if( num2 != 0 ) System.out.println( name + " : " + num1 + " / " + num2 + " = " + ( num1 / num2 ) ); else System.out.println("除數不能為0!"); break; } case ‘%‘: { // 1.處理結果的符號問題,使得結果的符號滿足數學的要求 // 2.解決NaN的問題 System.out.println( name + " : " + num1 + " % " + num2 + " = " + ( num1 % num2 ) ); break; } default : System.out.println("你在搗亂,我不理你,氣死你......"); } } } class Demo9 { public static void main(String[] args) { Calculator cal = new Calculator(); cal.init( 41 , ‘%‘ , 0 ); cal.calculate(); System.out.println("計算完畢!再來一次......"); } }
原創作者:DSHORE 出自:http://www.cnblogs.com/dshore123/ 歡迎轉載,轉載務必說明出處。(如果本文對你有用,可以點擊一下右下角的 推薦,謝謝!) |
java 封裝