首頁 Java java教程 java提高篇(一)-----理解java的三大特性之封裝

java提高篇(一)-----理解java的三大特性之封裝

Feb 09, 2017 pm 01:27 PM

從大二接觸Java開始,到現在也差不多三年了。從最基礎的HTML、CSS到最後的SSH自己都是一步一腳印走出來的,其中開心過、失落過、寂寞過。雖然是半道出家但是經過自己的努力也算是完成了「學業」。期間參加過培訓機構,但是極其不喜歡那種培訓方式,於是毅然的放棄了選擇自學(可憐我出了6000塊錢啊),雖然自學途中苦很多,但是樂更多,當中的付出和收穫只有自己知道。黃天不負有心人,鄙人愚鈍,在大四第一學期終於自學完成java(其中走了彎路,荒廢半年),並且憑藉它得到了一份不錯的工作,不勝感激!

       則有太多閒話!進入正題,LZ最近剛看完設計模式,感觸良多。而且在工作過程中深感java基礎不夠紮實,例如IO不熟、垃圾回收不知所雲、多態性七竅通五竅、反射不知、甚至連最基本的三大特性都搞得我迷糊了!所以我發狠心一定要好好彌補java基礎!從第一課開始---封裝!!!!!!

       三大特性之---封裝

         三大特性之---封裝

       封裝從字面上使用以理解為包裝的意思,專業點就是隱藏,是指利用抽象資料類型將資料和基於資料的操作封裝在一起,使其構成一個不可分割的獨立實體,資料被保護在抽象資料類型的內部,盡可能地隱藏內部的細節,只保留一些對外介面使之與外部發生聯繫。系統的其他物件只能透過包裹在資料外面的已經授權的操作來與這個封裝的物件進行交流和互動。也就是說使用者是不需要知道物件內部的細節(當然也無從知道),但可以透過該物件對外的提供的介面來存取該物件。

       對於封裝而言,一個物件它所封裝的是自己的屬性和方法,所以它是不需要依賴其他物件就可以完成自己的操作。

       使用封裝有三大好處:

          1良好的包裝能減少耦合。

           2、類別內部的結構可自由修改。

          3、可對成員有更精確的控制。

          4、隱藏訊息,以實現細節。

       首先我們先來看兩個類別:Husband.java、Wife.java

public class Husband {  
      
    /* 
     * 对属性的封装 
     * 一个人的姓名、性别、年龄、妻子都是这个人的私有属性 
     */  
    private String name ;  
    private String sex ;  
    private int age ;  
    private Wife wife;  
      
    /* 
     * setter()、getter()是该对象对外开发的接口 
     */  
    public String getName() {  
        return name;  
    }  
  
    public void setName(String name) {  
        this.name = name;  
    }  
  
    public String getSex() {  
        return sex;  
    }  
  
    public void setSex(String sex) {  
        this.sex = sex;  
    }  
  
    public int getAge() {  
        return age;  
    }  
  
    public void setAge(int age) {  
        this.age = age;  
    }  
  
    public void setWife(Wife wife) {  
        this.wife = wife;  
    }  
}
登入後複製
public class Wife {  
    private String name;  
    private int age;  
    private String sex;  
    private Husband husband;  
  
    public String getName() {  
        return name;  
    }  
  
    public void setName(String name) {  
        this.name = name;  
    }  
  
    public String getSex() {  
        return sex;  
    }  
  
    public void setSex(String sex) {  
        this.sex = sex;  
    }  
  
    public void setAge(int age) {  
        this.age = age;  
    }  
  
    public void setHusband(Husband husband) {  
        this.husband = husband;  
    }  
  
    public Husband getHusband() {  
        return husband;  
    }  
      
}
登入後複製

從上面兩個實例我們可以看出Husband裡面wife引用是沒有getter()的,同時wife的age也是沒有gwife()方法的。至於理由我想各位都懂的,男人嘛深屋藏嬌妻嘛,沒有那個女人願意別人知道她的年紀。

       所以封裝將一個物件的屬性私有化,同時提供一些可以被外部存取的屬性的方法,如果不想被外部方法,我們大可不必提供方法給外界訪問。但是如果一個類別沒有提供給外界存取的方法,那麼這個類別就沒有什麼意義了。例如我們將一個房子看做是一個對象,裡面的漂亮的裝飾,如沙發、電視劇、空調、茶桌等等都是該房子的私有屬性,但是如果我們沒有那些牆遮擋,是不是別人就會一覽無餘呢?沒有一點兒隱私!就是存在那個遮蔽的牆,我們既能夠有自己的隱私而且我們可以隨意的更改裡面的擺設而不會影響到其他的。但如果沒有門窗,一個包裹好的嚴嚴實實的黑盒子,又有什麼存在的意義呢?所以透過門窗別人也能夠看到裡面的風景。所以說門窗就是房子物件留給外界存取的介面。

       我們還不能真正體會封裝的好處。現在我們從程式的角度來分析封裝帶來的好處。如果我們不使用封裝,那麼該物件就沒有setter()和getter(),那麼Husband類別應該這樣寫:

public class Husband {  
    public String name ;  
    public String sex ;  
    public int age ;  
    public Wife wife;  
}
登入後複製

       我們應該這樣來使用它:

Husband husband = new Husband();  
husband.age = 30;  
husband.name = "张三";  
husband.sex = "男";    //貌似有点儿多余
登入後複製

但是那天如果我們需要修改Husband,例如將age修改為String類型的呢?你只有一處使用了這個類別還好,如果你有幾十個甚至上百個這樣地方,你是不是要改到崩潰。如果使用了封裝,我們完全可以不需要做任何修改,只需要稍微改變下Husband類別的setAge()方法即可。 }

public class Husband {  
      
    /* 
     * 对属性的封装 
     * 一个人的姓名、性别、年龄、妻子都是这个人的私有属性 
     */  
    private String name ;  
    private String sex ;  
    private String age ;    /* 改成 String类型的*/  
    private Wife wife;  
      
    public String getAge() {  
        return age;  
    }  
      
    public void setAge(int age) {  
        //转换即可  
        this.age = String.valueOf(age);  
    }  
      
    /** 省略其他属性的setter、getter **/
登入後複製
🎜其他的地方依然那樣引用(husband.setAge(22))保持不變。 🎜

到了这里我们确实可以看出,封装确实可以使我们容易地修改类的内部实现,而无需修改使用了该类的客户代码。

我们在看这个好处:可以对成员变量进行更精确的控制。

还是那个Husband,一般来说我们在引用这个对象的时候是不容易出错的,但是有时你迷糊了,写成了这样:

Husband husband = new Husband();  
husband.age = 300;
登入後複製

也许你是因为粗心写成了,你发现了还好,如果没有发现那就麻烦大了,逼近谁见过300岁的老妖怪啊!

但是使用封装我们就可以避免这个问题,我们对age的访问入口做一些控制(setter)如:

public class Husband {  
      
    /* 
     * 对属性的封装 
     * 一个人的姓名、性别、年龄、妻子都是这个人的私有属性 
     */  
    private String name ;  
    private String sex ;  
    private int age ;    /* 改成 String类型的*/  
    private Wife wife;  
  
    public int getAge() {  
        return age;  
    }  
  
    public void setAge(int age) {  
        if(age > 120){  
            System.out.println("ERROR:error age input....");    //提示錯誤信息  
        }else{  
            this.age = age;  
        }  
          
    }  
      
    /** 省略其他属性的setter、getter **/  
      
}
登入後複製

上面都是对setter方法的控制,其实通过使用封装我们也能够对对象的出口做出很好的控制。例如性别我们在数据库中一般都是已1、0方式来存储的,但是在前台我们又不能展示1、0,这里我们只需要在getter()方法里面做一些转换即可。

public String getSexName() {  
        if("0".equals(sex)){  
            sexName = "女";  
        }  
        else if("1".equals(sex)){  
            sexName = "男";  
        }  
        else{  
            sexName = "人妖???";  
        }  
        return sexName;  
    }
登入後複製

在使用的时候我们只需要使用sexName即可实现正确的性别显示。同理也可以用于针对不同的状态做出不同的操作。

public String getCzHTML(){  
        if("1".equals(zt)){  
            czHTML = "<a href=&#39;javascript:void(0)&#39; onclick=&#39;qy("+id+")&#39;>启用</a>";  
        }  
        else{  
            czHTML = "<a href=&#39;javascript:void(0)&#39; onclick=&#39;jy("+id+")&#39;>禁用</a>";  
        }  
        return czHTML;  
    }
登入後複製

       鄙人才疏学浅,只能领悟这么多了,如果文中有错误之处,望指正,鄙人不胜感激!

以上就是 java提高篇(一)-----理解java的三大特性之封装的内容,更多相关内容请关注PHP中文网(www.php.cn)!


本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

集邦諮詢:英偉達 Blackwell 平台產品帶動台積電今年 CoWoS 產能提升 150% 集邦諮詢:英偉達 Blackwell 平台產品帶動台積電今年 CoWoS 產能提升 150% Apr 17, 2024 pm 08:00 PM

本站4月17日消息,集邦諮詢(TrendForce)近日發布報告,認為英偉達Blackwell新平台產品需求看漲,預估帶動台積電2024年CoWoS封裝總產能提升逾150%。英偉達Blackwell新平台產品包含B系列的GPU,以及整合英偉達自家GraceArmCPU的GB200加速卡等。集邦諮詢確認為供應鏈目前非常看好GB200,預估2025年出貨量預計超過百萬片,在英偉達高階GPU中的佔比達到40-50%。在英偉達計畫下半年交付GB200以及B100等產品,但上游晶圓封裝方面須進一步採用更複

AMD 'Strix Halo” FP11 封裝尺寸曝光:和英特爾 LGA1700 相當,比 Phoenix 大 60% AMD 'Strix Halo” FP11 封裝尺寸曝光:和英特爾 LGA1700 相當,比 Phoenix 大 60% Jul 18, 2024 am 02:04 AM

本站7月9日訊息,AMDZen5架構「Strix」系列處理器會有兩種封裝方案,其中較小的StrixPoint將採用FP8封裝,而StrixHalo將會採用FP11封裝。圖源:videocardz訊息源@Olrak29_最新曝料稱StrixHalo的FP11封裝尺寸為37.5mm*45mm(1687平方毫米),和英特爾AlderLake、RaptorLakeCPU的LGA-1700封裝尺寸相同。 AMD最新的PhoenixAPU採用FP8封裝方案,尺寸為25*40mm,這意味著StrixHalo的F

C++ 函式如何透過封裝程式碼來提高 GUI 開發的效率? C++ 函式如何透過封裝程式碼來提高 GUI 開發的效率? Apr 25, 2024 pm 12:27 PM

透過封裝程式碼,C++函數可以提高GUI開發效率:程式碼封裝:函數將程式碼分組到獨立單元,使程式碼易於理解和維護。可重複使用性:函數可建立通用功能供應用程式中重複使用,減少重複編寫和錯誤。簡潔程式碼:封裝程式碼讓主邏輯簡潔,方便閱讀和除錯。

PHP中的封裝技術及應用 PHP中的封裝技術及應用 Oct 12, 2023 pm 01:43 PM

PHP中的封裝技術及應用封裝是物件導向程式設計中的重要概念,它指的是將資料和資料的操作封裝在一起,以便提供對外部程式的統一存取介面。在PHP中,封裝可以透過存取控制修飾符和類別的定義來實現。本文將介紹PHP中的封裝技術及其應用場景,並提供一些具體的程式碼範例。一、封裝的存取控制修飾符在PHP中,封裝主要透過存取控制修飾符來實現。 PHP提供了三個存取控制修飾符,

Vue中Axios封裝及其常用方法介紹 Vue中Axios封裝及其常用方法介紹 Jun 09, 2023 pm 04:13 PM

Vue中Axios封裝及其常用方法介紹Axios是一款基於Promise實現的HTTP庫,它的優點在於具有良好的可讀性、易用性以及可擴展性。 Vue作為一款流行的前端框架,也為Axios提供了全面支援。本文將介紹如何在Vue中進行Axios封裝,並介紹Axios常用的一些方法。一、Axios封裝在開發過程中,我們常常需要對Axios進行一些自訂的封裝,例如

如何解決Python的程式碼的可擴充性差錯誤? 如何解決Python的程式碼的可擴充性差錯誤? Jun 25, 2023 am 09:51 AM

Python作為一門高階程式語言,廣泛應用於資料分析、機器學習、Web開發等領域。然而,隨著程式碼規模不斷擴大,Python程式的可擴展性問題也逐漸顯現出來。可擴展性差錯誤是指Python程式在某些情況下無法很好地適應需求變化,無法對大規模資料進行處理,導致程式運作效果不佳。太多的依賴、糟糕的程式碼結構、缺乏文件等都是Python程式可擴展性差錯誤的罪魁禍首。

富士康打造 AI 一條龍服務,投資的夏普進軍半導體先進封裝:2026 投產、設計月產 2 萬片晶圓 富士康打造 AI 一條龍服務,投資的夏普進軍半導體先進封裝:2026 投產、設計月產 2 萬片晶圓 Jul 18, 2024 pm 02:17 PM

本站7月11日消息,經濟日報今天(7月11日)報道,富士康集團已進軍先進封裝領域,重點佈局時下主流的面板級扇出封裝(FOPLP)半導體方案。 1.繼旗下群創光電(Innolux)之後,富士康集團投資的夏普(Sharp)也宣布進軍日本面板級扇出式封裝領域,預計將於2026年投產。富士康集團在AI領域本身就有足夠的影響力,而補上先進封裝短板之後讓其可以提供「一條龍」服務,便於後續接受更多的AI產品訂單。本站查詢公開資料,富士康集團目前持有夏普10.5%的股權,該集團表示現階段不會增持,也不會減持,將維

如何在Go語言中實現封裝和繼承 如何在Go語言中實現封裝和繼承 Jul 23, 2023 pm 08:17 PM

如何在Go語言中實現封裝和繼承封裝和繼承是物件導向程式設計中的兩個重要概念,它們可以使程式碼更加模組化和可維護,同時也為程式碼的複用提供了便利。本文將介紹在Go語言中如何實作封裝和繼承,並提供對應的程式碼範例。封裝封裝是將資料和功能封裝,隱藏實作的細節,只暴露必要的介面給外部使用。在Go語言中,封裝是透過導出和非導出標識符來實現的。首字母大寫的標識符可以被其他包訪

See all articles