淺談Java三大特性之封裝


三大特性之淺談封裝

前言

英語:Encapsulation——封裝,包裝。

面向對象的封裝與真實世界的目的是一樣的。封裝能夠使外部訪問者不能隨意存取對象的內部數據,隱藏了對象的內部細節,只保留有限的對外接口。外部訪問者不用關心對象的內部細節,使得操作對象變得簡單。

好處

先通過閱讀下面的文字,再回來理解可能會更好一點

  1. 減少了耦合(物理學上類似相互影響的概念)
  2. 便於維護和修改
  3. 可以隱藏信息,一些具體實現代碼,安全性
  4. 對成員變量精准控制

介紹(實現方式)

  1. Java 面向對象的封裝性是通過對成員變量和方法進行訪問控制實現的。這里就涉及到了訪問控制的四個關鍵字了。

    類別\不同地方 同一個類 同一個包 不同包的子類 不同包非子類
    私有的(private) Yes No No No
    默認 Yes Yes No No
    保護的(protected) Yes Yes Yes No
    公有的(public) Yes Yes Yes Yes
  2. 封裝是一種保護作用,將其變量以及方法保護起來,防止被隨機訪問,所以一定程度上增強了代碼的安全性。

示例

  • 下面是代碼示例,私有類只能在同一個類中被訪問,否則會報錯。
image.png
  private還可以防止直接訪問特定的構造器(或全部的構造器)
    package music.daima.ebook;
class TestClass{
    private TestClass(){}
    static TestClass make(){
        return new TestClass();
    }
}


public class PrivateDaiMa {
    public static void main(String args[]){
//        TestClass x = new TestClass();
        TestClass x = TestClass.make();
//        不能通過構造器來創建TestClass,要通過調用make方法才可以
    }
}

報錯信息說明TestClass的private將其構造器給私有化了,不能直接訪問。

  • 訪問不同包的protected方法(非子類的),先是定義在Music類中的BaoHu方法。
image.png

在其它包訪問,就會報錯,因為在Music里面這個BaoHu的方法用的是protected修飾的。

image2.png

其實在Idea寫代碼時候,定義的屬性之類可以在左下角有個概覽,可以查看是什么類型的

image.png
  • 整體的test代碼
import music.Music;//導入了music包的Music類


class test{
    test(int i){

        i = i + 1;

    }
    private String name;//將其變為public String name;的話下面就可以訪問
    public int num=2;//公有的可以被訪問
    double i = 2.2;//默認的定義,也可以被訪問,在本包里面

}
public class FengZhuang {
    public static void  main(String args[]){
       test a = new test(6);
        System.out.println(a.num);
        //a.name就會報錯,因為在上面的name是私有的
        Music ceshi = new Music();//導入了不同的包中的類

//        ceshi.BaoHu();報錯,是在其它包里的protected方法

    }
}

小結

訪問成員有兩種方式:一種是調用,即通過類或對象調用它的成員,如p.printX()語句;另一種是繼承,即子類繼承父類的成員變量和方法。在開發使用的時候,應該盡量限制類中成員的可見性

  1. 公有訪問級別任何情況下兩種方式都可以;(public)

  2. 默認訪問級別在同一包中兩種訪問方式都可以,不能在包之外訪問;()

  3. 保護訪問級別在同一包中與默認訪問級別一樣,兩種訪問方式都可以。但是在不同包之

    外只能繼承訪問;(protected)

  4. 私有訪問級別只能在本類中通過調用方法訪問,不能繼承訪問。(private)

感謝閱讀!!!

才疏學淺,有不對的地方請指出。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM