大白帶你侃JAVA——封裝的概述及好處

封裝概述:

封裝是指隱藏對象的屬性和實現細節,僅對外提供公共訪問方式java

這是什麼意思呢?程序員

簡單的來講就是我將不想給別人看的數據,以及別人無需知道的內部細節, 「鎖起來」 ,咱們只留下一些入口,使其與外部發生聯繫。安全

咱們如何給咱們的數據 「上鎖」 呢?測試

咱們使用,public、private、protected 等權限修飾符 在類的內部設定了邊界,這些不一樣程度的 」鎖「 決定了緊跟其後被定義的東西可以被誰使用。this

封裝的好處:

· 隱藏實現細節,提供公共的訪問方式code

· 提升了代碼的複用性對象

· 提升安全性blog

封裝好處的體現方式:

(一)隱藏實現細節,提供公共的訪問方式

隱藏實現細節怎麼理解呢?繼承

咱們將一些功能封裝到類中,而客戶端的程序員,不須要知道類中的這個方法的邏輯原理,類程序員只須要給他一個對外的接口,客戶端程序員只須要可以調用這個方法便可,接口

例如:夏天宿舍很熱,咱們(用戶)只須要操做遙控器便可使用空調,並不須要瞭解空調內部是如何運行的

提供公共的訪問方式又怎麼理解呢?

咱們先來看一段標準案例

public class Student {
	//定義成私有成員變量(private)
    private String name;
    private int age;
	
    //無參構造
    public Student() {
        super();
    }

    //帶參構造
    public Student(String name, int age) {
        super();
        this.name = name;
        this.age = age;
    }
	
    //成員變量的set和get方法(與外界聯繫的橋樑)
    public void setName(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public int getAge() {
        return age;
    }
}
public class StudentDemo {
    public static void main(String[] args) {
        //建立學生類對象 s
        Student s = new Student();
            
        //對象s調用類中的公共方法setName()和setAge()
        //set方法給成員變量賦值
        s.setName("BWH_Steven");
        s.setAge(20);
        
        //get方法獲取成員變量
        System.out.println(s.getName() + s.getAge());
    }
}

咱們能夠看到在上面的案例中,成員變量都使用private修飾,而下面的get和set方法均使用了public修飾,其實被private修飾的屬性就是咱們想要鎖起來的數據,而set、get方法就是咱們打開這把鎖的鑰匙

被private所修飾的內容是,除類型建立者和類型的內部方法以外的任何人都不能訪問的元素,因此咱們這些數據就被咱們經過private 「鎖」 了起來,而咱們外界是能夠經過建立對象來調用一個類中的公共方法的,因此被public修飾的 set和get方法外界所能訪問的,而這兩個方法又能夠直接訪問咱們的私有成員變量,因此set和get方法就成爲了私有成員與外界溝通的鑰匙。

(二)提升了代碼的複用性

功能被封裝成了類,經過基類與派生類之間的一些機制(組合和繼承),來提升代碼的複用性

Ps:關於代碼複用問題,我會專篇講解,今天仍是着重講解封裝帶來的主要好處

(三)提升安全性

看完上面的代碼,可能你們會有一點疑惑,這些屬性、方法封裝後我都還能夠看獲得,這哪裏體現了安全呢?你們來一塊兒看一看咱們下面這個改進版的案例

public class Student {

    private String name;
    private int age;

    public Student() {
        super();
    }

    public Student(String name, int age) {
        super();
        this.name = name;
        this.age = age;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    //在setAge()方法中加入了校驗的內容
    //不合法數據是不容許傳遞給成員變量的
    public void setAge(int age) {
        if (age < 0 || age > 120) {
            System.out.println("Error");
        }else {
            this.age = age;
        }     
    }

    public int getAge() {
        return age;
    }
}
public class StudentDemo {
    public static void main(String[] args) {
        Student s = new Student();
        System.out.println(s.getName() + s.getAge());
        
        //錯誤的方式!!!
        s.name = "BWH_Steven";
        s.age = 20;
        System.out.println(s.getName() + s.getAge());
        
       	//正確的方式!!!
        s.setName("BWH_Steven");
        s.setAge(20);
    }
}

咱們用private來修飾咱們的成員變量不是沒有任何依據的,若是咱們的成員變量修飾符改成public,這句意味着外界可使用對象直接訪問,修改這個成員變量,這可能會形成一些重大的問題

例如:外界經過對象去給成員變量賦值,能夠賦值一些非法的數據

這明顯是不合理的。因此在賦值以前應該先對數據進行判斷

StudenDemo是一個測試類,測試類通常只建立對象,調用方法

因此這個判斷應該定義在Student類中。須要使用邏輯語句

邏輯語句應該定義在方法中。因此在Student類中提供一個方法來對數據進行校驗

可是若是恰恰不調用方法來賦值,仍是直接賦值,這樣咱們的方法就沒有起做用

因此咱們必須強制要求使用個人方法,而不能直接調用成員變量

這也正是咱們使用private修飾成員變量的緣由!

結尾:

若是內容中有什麼不足,或者錯誤的地方,歡迎你們給我留言提出意見, 蟹蟹你們 !^_^

若是能幫到你的話,那就來關注我吧!

在這裏的咱們素不相識,卻都在爲了本身的夢而努力 ❤

一個堅持推送原創Java技術的公衆號:理想二旬不止

相關文章
相關標籤/搜索