1. 程式人生 > >java 封裝

java 封裝

邏輯 print num www 實例 ont pos post 一次

1 前言

  我們日常使用的電腦主機,把cpu、內存、主板等等都封裝到機箱裏面去。假如沒有機箱的話的出現什麽問題,主機、主板全部都散落在一處,然後開機沒有開機按鈕,那麽需要我們直接操作接跳線才能把電腦開啟。這樣子的話假如操作不慎的話,會讓機器損壞危險,那麽假如用機箱封裝起來的話,那麽就不需要這樣子做了。體現了封裝的---安全特性。

  你拿電腦去加內存,可以直接給電腦給維修的人,等他加好內存了之後。你拿到的還是那個機箱,裏面發生了怎樣子的變化你並不知道。封裝的第二個好處----將變化隔離。

  在機箱裏面提供一個開機按鈕,而不需要你直接使用跳線開機的話,體現了封裝的---便於使用的特性。

  只要機箱提供了一個開機的功能,然後無論這個機箱拿到哪裏去,都可以使用這個開機的功能

.體現了封裝的---提供重復性的特性。

2 沒有封裝

模擬問題

  1. 描述Employee類。定義姓名,工號,性別的成員變量,和工作的方法。成員使用public修飾。
  2. 創建Employee對象,對象.成員的方式進行賦值。最後該對象調用工作方法。
  3. 總結:如果不使用封裝,很容易賦值錯誤,並且任何人都可以更改,造成信息的 不安全。
  4. 問題解決使用封裝
package oop01;

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 + " 努力工作中!!!"); } }

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:為什麽之前可以通過對象名.屬性名的方式訪問?

  2public 成員修飾符,公共的誰都可以訪問。

  3private 成員修飾符,私有的,只有自己可以訪問。

2:修改Employee類 性別的修飾符修改為private

  1:編譯不通過

  2private修飾的成員在自己所在的類中可以使用,在類外邊不可以使用。

  3Employee類的gender的修飾符修改為private後,無法再類外調用,那麽如何給gender設置值?

    1:對外提供公開的用於設置對象屬性的public方法

      1:設置set

      2:獲取get

    2:在set方法中加入邏輯判斷,過濾掉非法數據。

    3:將所有的成員變量封裝加上private,提供getset方法

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 封裝