最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

詳細聊一聊java中封裝的那點事

 更新時間:2022年04月29日 09:58:32   作者:是小魚兒哈  
封裝是一個非常廣泛的概念,小到一個屬性的封裝,大到一個框架或者一個項目的封裝,下面這篇文章主要給大家介紹了關于java中封裝的那點事,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下

什么是封裝

什么是封裝呢?我們先來看一段代碼

class Student {
    public String name;
    private int age;
}
public class Test4 {
    public static void main(String[] args) {
        // 引用變量student指向該新創(chuàng)建的對象
        Student student = new Student();    // 實例化對象
        student.age = 12; // 通過引用變量名.成員變量來訪問Student類中的成員變量            
    }
}

 讓我們運行一下

 好家伙,報錯了,為什么當age被private修飾后就不能訪問了呢?

??private的字面意思就是私人的、私有的,在java中被private修飾的變量只能在當前類中訪問,就像上面的Student類中的age變量,它就只能在Student這個類中被訪問,不能在Test4這個類中訪問。 

這樣有什么用呢?當然有用??

這樣可以防止age其他地方被隨意的修改,比如把age賦值成一個負數,那合適嗎、正常嗎?

 ??那name成員變量前的public又是什么意思呢?public就是公共的、公開的,被public修飾的成員變量不管在那都是可以被訪問的。我們之前在定義成員變量時,好像在變量前沒有像public、private這樣的東東呀!那時我們也能通過對象引用一個一個的訪問那些成員變量呀?

??這時我們就有必有引入封裝這個概念了

??封裝將類的某些信息隱藏在類內部,不允許外部程序直接訪問,只能通過該類提供的方法來實現對隱藏信息的操作和訪問。例如:一臺計算機內部極其復雜,有主板、CPU、硬盤和內存, 而一般用戶不需要了解它的內部細節(jié),不需要知道主板的型號、CPU 主頻、硬盤和內存的大小,于是計算機制造商將用機箱把計算機封裝起來,對外提供了一些接口,如鼠標、鍵盤和顯示器等,這樣當用戶使用計算機就非常方便。

??封裝的特點:

  • 只能通過規(guī)定的方法訪問數據。
  • 隱藏類的實例細節(jié),方便修改和實現。

??實現封裝的具體步驟如下:

  • 修改屬性的可見性來限制對屬性的訪問,一般設為 private。
  • 為每個屬性創(chuàng)建一對賦值(setter)方法和取值(getter)方法,一般設為 public,用于屬性的讀寫。
  • 在賦值和取值方法中,加入屬性控制語句(對屬性值的合法性進行判斷)。

??我們剛才提到的private其實就是一種封裝,被private修飾的只能本類才能訪問,其他類都訪問不了,如此就對信息進行了隱藏。

??那么我們如何訪問被private修飾的成員變量呢?

??如果外界想要訪問私有屬性,需要提供一些使用public修飾的公有方法。其中包括用于獲取屬性值的getXxx方法和設置屬性值的setXxx方法 。

class Student {
    public String name;
    private int age;
 
    public int getAge() {        // 這些專門用來訪問設置屬性的方法一般用public來修飾
        return age;
    }
 
    public void setAge(int age) {
        this.age = age;
    }
}
public class Test4 {
    public static void main(String[] args) {
        Student student = new Student();
        student.name = "張三";   // 被public修飾的可以在其他類中隨意訪問(但不太安全,有風險)
        System.out.println("姓名:" + student.name);
 
        System.out.println("======這是分割線========");
        student.setAge(19);    // 通過專門的設置屬性的setAge()方法來賦值(安全,不能隨意修改)
        System.out.println("年齡:" + student.getAge());//通過專門的訪問屬性的getAge()來打印
    }
}

 

從運行結果來看,姓名、年齡都被成功的賦值并打印了。但因為他們前面的訪問修飾限定符不一樣,所以對年齡、姓名的訪問權限也不同,訪問方式自然也不同了。

封裝拓展之包

??而如果你沒任何修飾限定符,編譯器默認就是包訪問權限;想要理解什么是包訪問權限,你首先要理解什么是包。

包的概念

??在面向對象體系中,提出了一個軟件包的概念,即:為了更好的管理類,把多個類收集在一起成為一組,稱為軟件 包。

??這其實有點類似于我們電腦中不同的文件夾。

在Java中也引入了包,包是對類、接口等的封裝機制的體現,是一種對類或者接口等的很好的組織方式,比如:一 個包中的類不想被其他包中的類使用。

包還有一個重要的作用:在同一個工程中允許存在相同名稱的類,只要處在不同的包中即可。 

?? 我們可以IDEA里嘗試創(chuàng)建一個包:

??然后輸入你包的名字,比如demo1,然后回車

??就新創(chuàng)建了一個新的文件夾demo1

 ??在這個文件夾(也就是這個包中)我們就可以添加我們的java文件了

 

 什么是包訪問權限

 包訪問權限就是只要我們再同一個包下面就可以訪問互相訪問,即使他們不在同一個java文件里面

為了更清楚一點,我們來實踐一下

??可以看到我們在testdemo1中定義了一個變量a,成員變量a的訪問權限是包訪問權限

 看來只要這個變量是包訪問權限,那么在一個包下變量可以互相訪問呀!

 那么如果不在一個包下呢

 看來就無法訪問了??

??這下你對包訪問權限是否有了一個初步的理解了呢?

??從上面的例子我們也不難發(fā)現,

被private修飾的變量只能在同一個類中訪問默認的包訪問權限可以在同一個包下、不同的類中來訪問而public則是哪都能訪問 

????????????????????????????????

什么是靜態(tài)成員

靜態(tài)成員就是被關鍵字static修飾的成員變量或者成員方法。

??而static又是什么呢?老規(guī)矩,先來看一段代碼

class Student {
    private String name;
    private int age;
    public static String school;   // 定義一個靜態(tài)成員變量
 
    public Student(String name, int age) {
        this.name = name;
        this.age = age;
        // 想一下我下面為什么不用this.school來訪問
        System.out.println("姓名:" + this.name + " 年齡:" + this.age + " 學校:" + school);
    }
}
public class Test4 {
    public static void main(String[] args) {
        // 奇怪吧!我還沒實例化對象呢?怎么就能對類中的成員變量賦值呢?
        Student.shool = "茶啊二中"; 
        Student student1 = new Student("張三", 17);
        Student student2 = new Student("李四", 16);
        Student student3 = new Student("王五", 18);
    }
}

 ??可以看出,上面我們創(chuàng)建的三個學生對象都在同一個學校,所以為了節(jié)省內存空間,我們其實不需要讓創(chuàng)建的每個對象都儲存一份學校這個屬性??,只要有一個內存儲存學校這個屬性,然后大家共享就好了。

下面先來看共享的一個例子:

class Student {
    private String name;
    private int age;
    public static String school;   // 定義一個靜態(tài)成員變量
 
    public Student(String name, int age) {
        this.name = name;
        this.age = age;
        // 想一下我下面為什么不用this.school來訪問
        System.out.println("姓名:" + this.name + " 年齡:" + this.age + " 學校:" + school);
    }
}
public class Test4 {
    public static void main(String[] args) {
        // 奇怪吧!我還沒實例化對象呢?怎么就能對類中的成員變量賦值呢?
        Student.shool = "茶啊二中"; 
        Student student1 = new Student("張三", 17);
        Student student2 = new Student("李四", 16);
        Student student3 = new Student("王五", 18);
    }
}

 什么情況,竟然沒報錯?

??我想你在看了上面的代碼,肯定有很多疑惑吧!別著急我們慢慢來揭開static這層神秘的面試

Java 中,被 static 修飾的成員,稱之為靜態(tài)成員,也可以稱為類成員,其不屬于某個具體的對 象,是所有對象所共享的 。 如果把shool這個屬性設置為static,那school這個靜態(tài)變量將會單獨儲存在靜態(tài)區(qū),而不是和他所在的對象一起存儲在堆區(qū)。什么意思呢?咱們用圖說話:

 如上圖所示,實例化的對象student1和student2共享school這個成員屬性。

從上圖我們也可以看出靜態(tài)區(qū)的school其實是不依賴對象的,因為他根本都沒在對象所在的堆區(qū),所以我們可以直接通過:類名.school來訪問這個成員變量。

 哈哈,是不是有有點暈??。就快完了,加油!

??被static修飾的變量稱為靜態(tài)變量,被static修飾的方法稱為靜態(tài)方法

??不管靜態(tài)變量還是靜態(tài)方法都不屬于某個具體的對象,而是整個類的屬性。我們下面嘗試用一下靜態(tài)方法,看看他和普通方法的區(qū)別在哪里?

?? 可以看出程序在 " run() "這個地方報錯了,為啥在靜態(tài)方法中不能調用普通方法呢?

??我們前面說過this這個關鍵字,其實在這里報錯就和this引用有關。我們先來回顧一下this

 (?´?`?)(?´?`?)(?´?`?)(?´?`?)(?´?`?)

??this的深入:1.在每一個非靜態(tài)方法的內部,都有一個this,相當于一個句柄,由編譯器隱示添加。method(參數列表)可以看成是method(類名 this,參數列表)

??在面向對象中,成員屬性必須由對象調用,所以在方法內部,每一個成員其實都有一個this.”前綴,當對象調用這個方法的時候,編譯器會把該對象傳遞給方法(也就是常說的“this指向調用該方法的當前對象”),編譯器會將其編譯為method(對象,實參列表)。

  ?? 而在一個靜態(tài)方法內部,由于靜態(tài)方法是屬于類的,被每個類的實例所共享,所以沒有this句柄,當然就不能在靜態(tài)方法中訪問非靜態(tài)的成員(屬性和方法)??,而具體在編譯器會怎么看愣,編譯器會說哪個對象調用了成員,我都找不到這個對象??,然后它就會大吼一句“還有誰?。?!”,最后報錯??。

??所以說,靜態(tài)方法里面調用的必須是不依賴對象的成員變量和成員方法——即靜態(tài)方法和靜態(tài)變量,當我們把上面的run普通方法改成靜態(tài)方法,編譯器自然就不報錯了。

總結一下: 

被static修飾的成員變量或方法,被所有對象所共享靜態(tài)變量和靜態(tài)方法可以直接被類名所調用靜態(tài)方法只能調用靜態(tài)成員,不能調用非靜態(tài)成員。非靜態(tài)方法可以調用靜態(tài)成員,也可以調用非靜態(tài)成員

好了,以上就們就對靜態(tài)成員有了一個初步的認識。

到此這篇關于java中封裝的文章就介紹到這了,更多相關java封裝詳解內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • 詳解Spring Aop實例之AspectJ注解配置

    詳解Spring Aop實例之AspectJ注解配置

    本篇文章主要介紹了詳解Spring Aop實例之AspectJ注解配置,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-04-04
  • java實現簡易版簡易版dubbo

    java實現簡易版簡易版dubbo

    dubbo是阿里開源的rpc框架,目前是apache頂級開源項目,可以用來構建微服務。本文主要介紹了如何通過java實現簡易版的dubbo,感興趣的小伙伴可以了解一下
    2021-11-11
  • SpringBoot中多環(huán)境啟動配置的教程詳解

    SpringBoot中多環(huán)境啟動配置的教程詳解

    在SpringBoot項目的生命周期中,存在不同的環(huán)境,我們就需要針對不同環(huán)境制定不同名稱的配置文件,里面放置不同環(huán)境下所需的配置項,下面小編就來和大家詳細講講SpringBoot如何進行多環(huán)境啟動配置的吧
    2024-02-02
  • Java Serializable和Parcelable詳解及實例代碼

    Java Serializable和Parcelable詳解及實例代碼

    這篇文章主要介紹了Java Serializable和Parcelable詳解,并附實例代碼的相關資料,需要的朋友可以參考下
    2016-09-09
  • Java實現網絡數據提取所需知識點

    Java實現網絡數據提取所需知識點

    這篇文章主要介紹了Java實現網絡數據提取所需知識點,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-07-07
  • SpringBoot加載外部依賴過程解析

    SpringBoot加載外部依賴過程解析

    這篇文章主要介紹了SpringBoot加載外部依賴過程解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-01-01
  • 關于jdk8升級jdk21 cxf報錯的踩坑記錄

    關于jdk8升級jdk21 cxf報錯的踩坑記錄

    在升級Java項目時,從JDK1.8和Spring2遷移到JDK21和Spring3后,遇到了JAXBException錯誤,原因是從JDK11開始移除了jaxb模塊,而cxf在編譯動態(tài)客戶端時默認classpath不包含必要的類,解決方法是在jar包同級目錄創(chuàng)建libs并添加jakarta.xml.bind-api
    2024-10-10
  • Spring Boot文件上傳最新解決方案

    Spring Boot文件上傳最新解決方案

    本文給大家分享Spring Boot文件上傳功能的示例代碼,包括單文件上傳示例和多文件上傳,代碼簡單易懂,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友參考下吧
    2021-07-07
  • java實現簡單的拼圖游戲

    java實現簡單的拼圖游戲

    這篇文章主要為大家詳細介紹了java實現簡單的拼圖游戲,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-07-07
  • idea代碼模板設置方式

    idea代碼模板設置方式

    這篇文章主要介紹了idea代碼模板設置方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-12-12

最新評論

宜兰县| 巩留县| 永安市| 青神县| 公安县| 牟定县| 商都县| 湟中县| 哈巴河县| 漾濞| 清流县| 亳州市| 通州市| 磴口县| 石屏县| 清涧县| 兴安县| 勐海县| 五常市| 荔波县| 讷河市| 乌鲁木齐市| 兴义市| 改则县| 衡山县| 阜康市| 张家港市| 麻城市| 太谷县| 渭南市| 泰来县| 石阡县| 乌兰浩特市| 沐川县| 阿坝县| 南投市| 游戏| 东阿县| 福泉市| 喀喇| 汉川市|