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

Java如何實(shí)現(xiàn)封裝和包

 更新時間:2026年01月08日 09:31:39   作者:蘇小瀚  
文章主要介紹了Java中的封裝、訪問修飾符、封裝的好處、封裝的步驟、包的概念、導(dǎo)入包、自定義包、常用的包、static關(guān)鍵字及其用法、代碼塊、對象的打印等內(nèi)容

1. 什么是封裝

封裝就是對類里面的成員變量和成員方法進(jìn)行隱藏,只能在所在類的范圍內(nèi)使用,只留下一些可以被外部訪問的方法,供外部調(diào)用,隱藏方法實(shí)現(xiàn)的內(nèi)部細(xì)節(jié)。

這就好比一臺電視機(jī),給你提供了一個遙控器供你使用,進(jìn)行一系列操作,但是操作的內(nèi)部細(xì)節(jié)你看不到,只是通過遙控器來實(shí)現(xiàn)功能。

2. 訪問修飾符

Java當(dāng)中是通過類和訪問權(quán)限來實(shí)現(xiàn)封裝的,類可以實(shí)現(xiàn)數(shù)據(jù)和封裝的數(shù)據(jù)存儲在一起,而訪問修飾符則可以設(shè)置數(shù)據(jù)的訪問權(quán)限。

訪問權(quán)限范圍有四個:private ,默認(rèn)的, protected , public 。只有三個訪問修飾符它們的訪問權(quán)限也是不一樣的。如圖所示:

private修飾的屬性和方法只能在類內(nèi)部使用,不能在類外部直接使用。

3. 封裝的好處

1.可以隱藏類內(nèi)部的實(shí)現(xiàn)細(xì)節(jié)。

2.可以保證安全和合理,比如說要對屬性設(shè)置值,可以在封裝的類里面先判斷設(shè)置的值是否合理,再考慮是否賦值。

4. 封裝的步驟

1.對屬性和方法進(jìn)行私有化(只能在類里面使用,不能直接修改值)

2. 設(shè)置public的set方法實(shí)現(xiàn)對私有的屬性的初始化。

3. 設(shè)置public的get方法獲取成員變量的值。

舉個Student類的例子:

class Student{
    private String name;
    private int age;
    private String stuNum;
    public void setName(String name) {
        this.name = name;
    }
    public String getName() {
        return name;
    }
}

public class Test {
    public static void main(String[] args) {
        Student student = new Student();
        student.setName("張三");
        System.out.println(student.getName());
    }
}

上面就是設(shè)置的兩個公共方法一個設(shè)置成員變量的值,一個返回成員變量的值。

但是每個成員變量都要寫過于麻煩,因此idea提供一種快捷方法,可以直接生成這兩個方法:

1.鼠標(biāo)在類內(nèi)部右擊找到下面的選項(xiàng):

2. 找到下面選項(xiàng): 

3. 把需要生成的成員變量選上,ok。 

這樣就實(shí)現(xiàn)了間接訪問成員變量。

但是為什么把屬性設(shè)置成了私有還可以被外部間接訪問呢?

因?yàn)椋庋b的屬性和方法是為類內(nèi)部的其他方法提供的,而設(shè)置的一些公共類的方法就可以被外部所訪問,而這個方法又可以使用封裝的屬性和方法,這樣既隱藏了封裝的方法的內(nèi)部細(xì)節(jié),又可以通過公共方法給外部間接使用。

5. 包

5.1 什么是包

包本質(zhì)上是對類的一種管理形式,包里面包含了很多的類,也就是說包相當(dāng)于是一個文件夾,里面存放了很多的.Java文件,一個.Java文件對應(yīng)一個類。

5.2 導(dǎo)入包中的類

這里我們可以用到import關(guān)鍵字進(jìn)行導(dǎo)入包,也成為打包。例如:

import java.util.Arrays;

java.util就是包的名字,而Arrays就是類名。

當(dāng)然我們也可以不導(dǎo)入包直接在代碼中使用,如下:

        int[] a = new int[]{6,4,2,1};
        java.util.Arrays.sort(a);
        System.out.println(java.util.Arrays.toString(a));

但是這樣書寫太麻煩了,但是當(dāng)兩個包里面有相同名字的類都被使用的時候就需要這樣去寫。

當(dāng)然還有一種寫法是: *叫做通配符

import java.util.*;

不同的包里面可以有相同的類名,這兩個類只是名字相同,但是作用不相同。 

這種方法可以導(dǎo)入包里面的全部類,但是不建議這樣書寫。因?yàn)橛锌赡茉趦蓚€包里面會有相同名字的類,這樣書寫就會導(dǎo)致沖突,編譯器會報(bào)錯。

在java.util包里面有一個Date的類,在java.sql包里面也有一個Date的類,如果書寫成如下格式就會報(bào)錯:

因?yàn)檫@樣的話,在代碼中使用時,編譯器無法識別是哪一個包下面的類,所以遇到這種情況,只能用import導(dǎo)入一個類,另一個類則需要在使用的時候進(jìn)行導(dǎo)入。如圖:

import java.util.Date;

Date date = new Date();
java.sql.Date date1 = new java.sql.Date(10);

5.3 自定義包

在src文件下創(chuàng)建一個包:

包的命必須是字母,數(shù)字,點(diǎn)號,下劃線,數(shù)字不能開頭,不能包含關(guān)鍵字,一般都為小寫。

一般公司命名是以 com.公司名.項(xiàng)目名.模塊名 來命名的。

回車后就創(chuàng)建好了一個包:

 com是一級目錄,abc是二級目錄,www是三級目錄。Test1是類。

Test1類里面代碼如下:

package com.abc.www;

public class Test1 {
    public void test1() {
        System.out.println("haha");
    }
}

package是編譯器自己生成的,為了聲明該類在那個包里面。

下面我自己編寫了一段代碼。

如果要在其他類中調(diào)用自定義包里面的方法,就是如下圖:

import com.abc.www.Test1;

public class Test {
    public static void main(String[] args) {
        Test1 test1 = new Test1();
        test1.test1();
    }
}

這樣就可以調(diào)用了,com.abc.www是包名,Test1是類名,test1是類里面的方法。

5.4 常用的包

  • java.lang    lang是基本包,默認(rèn)引入的,不需要再導(dǎo)入。
  • java.util      系統(tǒng)提供的工具包,包含工具類。
  • java.net      網(wǎng)絡(luò)開發(fā)用的。
  • java.awt   做Java的頁面開發(fā)的。

6. static關(guān)鍵字

static是用來修飾成員的,被static修飾的成員叫做靜態(tài)成員,也叫做類成員,表示該成員不屬于任何一個對象的,而是所有對象共同包含成員。被static修飾的成員都存儲在方法區(qū)中,我用下面的代碼幫助大家理解:

class Student{
    public String name;
    public int age;
    public String stuNum;
    public static String classNum;

    public Student(String name, int age, String stuNum) {
        this.name = name;
        this.age = age;
        this.stuNum = stuNum;
    }
}
public class Test {
    public static void main(String[] args) {
        Student student1 = new Student("張三",18,"202311");
        Student student2 = new Student("李四",19,"202312");
    }
}

此時學(xué)生1和學(xué)生2這兩個對象都在同一個班級,那么班級屬性是兩個對象都一樣的,就可以被static修飾。

6.1 static修飾成員變量

當(dāng)static修飾完成員變量后,該成員變量就屬于類的變量,而不是方法的變量,此時該靜態(tài)變量就不會在根據(jù)類的定義在堆區(qū)申請的對象的內(nèi)存空間中了,而是在方法區(qū)中了。

如下圖所示關(guān)系:

此時我們?nèi)绾卧L問靜態(tài)變量呢?

有兩種方式:

Student student1 = new Student("張三",18,"202311");
//通過對象的引用來訪問
student1.classNum = "1班";
//通過類名訪問
Student.classNum = "1班";

第一種是通過對象的引用來訪問,但是不建議使用,因?yàn)殪o態(tài)變量不在對象申請的內(nèi)存中,在方法區(qū)中,屬于類的變量。

第二種是通過類名.靜態(tài)方法來訪問。

注意:

  • 靜態(tài)變量的訪問不依賴于對象,不需要實(shí)例化對象,就可以直接訪問。
  • 類變量存儲在方法區(qū)中。
  • 類變量的生命周期是整個類的生命周期。
  • 靜態(tài)變量是所有對象共享的,不存在于某個對象的空間里。

6.2 static修飾成員方法

static修飾成員方法后,成員方法變成靜態(tài)成員方法,靜態(tài)成員變量的訪問不依賴于對象,屬于類方法,存在于方法區(qū),有兩種訪問方式:

class Student {
    public String name = "張三";
    public int age = 18;
    public String sex = "男";
    public static void print() {
        System.out.println("hehe");
    }
}
public class Test1 {
    public static void main(String[] args) {
        //方法一
        Student student = new Student();
        student.print();
        //方法二
        Student.print();
    }
}

方法一:是通過對象來訪問,這種方法雖然不會報(bào)錯,但是不建議使用,因?yàn)殪o態(tài)方法屬于類方法,不依賴于對象。

方法二:直接通過類名訪問,這種方法建議使用。

注意:

  • 靜態(tài)方法里面不能使用this關(guān)鍵字,因?yàn)閠his關(guān)鍵字依賴于對象,而靜態(tài)方法的訪問不依賴于對象。
  • 靜態(tài)方法不能直接訪問非靜態(tài)方法和非靜態(tài)變量,但可以通過對象的實(shí)例化間接訪問。
  • 非靜態(tài)方法可以直接訪問靜態(tài)方法和靜態(tài)變量,非靜態(tài)方法依賴于對象,靜態(tài)方法和靜態(tài)變量不依賴于對象。
  • 不同類間訪問靜態(tài)方法或靜態(tài)變量,通過類名.方法名或變量名訪問。
  • 不同類間訪問非靜態(tài)方法或非靜態(tài)變量,對象實(shí)例化后,通過對象來訪問。
  • static不能修飾局部變量。

6.3 Static修飾成員變量初始化

靜態(tài)成員方法初始化方法有四種:

  1. 通過就地初始化,也就是直接初始化值。
  2. 通過set方法初始化。
  3. 通過構(gòu)造方法初始化。
  4. 通過靜態(tài)代碼塊初始化

7. 代碼塊

代碼塊是指被{}包含的內(nèi)容,一般情況下是用來對成員變量進(jìn)行初始化的。分為三種:

7.1 普通代碼塊

這是定義在方法內(nèi)的代碼塊:

    public static void main(String[] args) {
        //普通代碼塊
        {
            int a = 10;
            System.out.println(a);
        }
    }

7.2 構(gòu)造代碼塊

定義在類里面的代碼塊,也叫做實(shí)例代碼塊。用來初始化非靜態(tài)成員變量的,在實(shí)例化對象的時候執(zhí)行:

class Student {
    public String name = "張三";
    public int age = 18;
    public static String sex = "男";
    //實(shí)例代碼塊
    {
        name = "李四";
        age = 20;
    }
}

7.3 靜態(tài)代碼塊

定義在類里面的代碼塊,用來初始化靜態(tài)成員變量的,在類加載的時候執(zhí)行:

class Student {
    public String name = "張三";
    public int age = 18;
    public static String sex = "男";
    //靜態(tài)代碼塊
    static {
        sex = "女";
    }
}

靜態(tài)代碼塊只能初始化靜態(tài)成員變量。因?yàn)榉庆o態(tài)對象初始化依賴于對象。 

7.4 各種初始化

我們已經(jīng)知道了 用構(gòu)造方法來初始化成員變量,還有就地初始化成員變量,還有代碼塊初始化成員變量,代碼塊又分為靜態(tài)代碼塊和實(shí)例代碼塊。

那它們的執(zhí)行先后順序又是怎樣的呢?

  • 多個靜態(tài)代碼塊或者多個實(shí)例代碼塊同時初始化,則是按照代碼的先后順序初始化。
  • 靜態(tài)代碼塊是在類加載時執(zhí)行的,而構(gòu)造方法和實(shí)例初始化則是在實(shí)例化對象時執(zhí)行的,所以靜態(tài)代碼塊先執(zhí)行,如果有靜態(tài)變量就地初始化,會按照先后順序進(jìn)行執(zhí)行,而實(shí)例初始化比構(gòu)造方法先執(zhí)行。
  • 一般成員變量的定義和初始化先寫,在寫其他的代碼塊或者方法。

執(zhí)行順序?yàn)椋壕偷爻跏蓟?>靜態(tài)代碼塊->實(shí)例代碼塊->構(gòu)造方法。

如果實(shí)例化多個對象時,由于類只會在第一次實(shí)例化對象時加載一次,也就是說靜態(tài)代碼塊只執(zhí)行一次,第二次實(shí)例化對象時,不執(zhí)行靜態(tài)代碼塊,只執(zhí)行實(shí)例代碼塊和構(gòu)造方法。

8. 對象的打印

如果想打印對象的屬性也就是成員變量有什么快捷方式嗎?

這里idea提供了一種快捷方式,生成toString方法來進(jìn)行打印,相當(dāng)于println方法調(diào)用valueof方法,valueof方法調(diào)用toString方法。:

class Student {
    public String name = "張三";
    public int age = 18;
    public String sex = "男";
    //打印成員變量的方法:
    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", sex='" + sex + '\'' +
                '}';
    }
}

public class Test1 {
    public static void main(String[] args) {
        Student student = new Student();
        System.out.println(student);
    }
}

打印結(jié)果如下:

這樣就可以實(shí)現(xiàn)快速打印對象的屬性。

如果不寫toString方法,默認(rèn)打印的是地址。當(dāng)然這種快捷方式不能生成靜態(tài)成員變量。 

總結(jié)

以上為個人經(jīng)驗(yàn),希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Java?Swing實(shí)現(xiàn)記事本頁面

    Java?Swing實(shí)現(xiàn)記事本頁面

    這篇文章主要為大家詳細(xì)介紹了Java?Swing實(shí)現(xiàn)記事本頁面,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-02-02
  • mybatis in foreach 雙層嵌套問題

    mybatis in foreach 雙層嵌套問題

    這篇文章主要介紹了mybatis in foreach 雙層嵌套問題,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-03-03
  • JAVA中取整數(shù)的4種方法總結(jié)

    JAVA中取整數(shù)的4種方法總結(jié)

    這篇文章主要給大家介紹了關(guān)于JAVA中取整數(shù)的4種方法,在java的Math類中,提供了許許多多的和數(shù)學(xué)計(jì)算有關(guān)的方法,其中也包括取整的,需要的朋友可以參考下
    2023-07-07
  • SpringCache常用注解及key中參數(shù)值為null問題解析

    SpringCache常用注解及key中參數(shù)值為null問題解析

    這篇文章主要介紹了SpringCache常用注解及key中參數(shù)值為null的問題解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-09-09
  • java  工廠方法詳解及實(shí)例代碼

    java 工廠方法詳解及實(shí)例代碼

    這篇文章主要介紹了java 工廠方法詳解及實(shí)例代碼的相關(guān)資料,需要的朋友可以參考下
    2017-01-01
  • 基于SpringBoot實(shí)現(xiàn)驗(yàn)證碼功能的代碼及思路

    基于SpringBoot實(shí)現(xiàn)驗(yàn)證碼功能的代碼及思路

    SpringBoot技術(shù)是目前市面上從事JavaEE企業(yè)級開發(fā)過程中使用量最大的技術(shù),下面這篇文章主要給大家介紹了如何基于SpringBoot實(shí)現(xiàn)驗(yàn)證碼功能的相關(guān)資料,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2024-07-07
  • SpringBoot實(shí)現(xiàn)優(yōu)雅停機(jī)的多種方式

    SpringBoot實(shí)現(xiàn)優(yōu)雅停機(jī)的多種方式

    優(yōu)雅停機(jī)(Graceful Shutdown)在現(xiàn)代微服務(wù)架構(gòu)中是非常重要的,它幫助我們確保在應(yīng)用程序停止時,不會中斷正在進(jìn)行的請求或?qū)е聰?shù)據(jù)丟失,讓我們以通俗易懂的方式來講解這個概念以及如何在 Spring Boot 中實(shí)現(xiàn)它,需要的朋友可以參考下
    2025-01-01
  • java常用的定時任務(wù)框架及相關(guān)代碼應(yīng)用示例

    java常用的定時任務(wù)框架及相關(guān)代碼應(yīng)用示例

    在Java開發(fā)中,定時任務(wù)是一個常見的需求,比如定時備份數(shù)據(jù)、定時清理日志、定時發(fā)送郵件等,這篇文章主要介紹了java常用的定時任務(wù)框架及相關(guān)代碼應(yīng)用的相關(guān)資料,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2025-11-11
  • SpringBoot使用@Validated處理校驗(yàn)的方法步驟

    SpringBoot使用@Validated處理校驗(yàn)的方法步驟

    @Validated?注解的主要目的是啟用和利用?Spring?的驗(yàn)證框架,它可以用于類上也可以用于方法參數(shù)上,本文給大家介紹了SpringBoot使用@Validated優(yōu)雅的處理校驗(yàn)的方法步驟,通過代碼示例介紹的非常詳細(xì),需要的朋友可以參考下
    2024-08-08
  • SSH框架網(wǎng)上商城項(xiàng)目第1戰(zhàn)之整合Struts2、Hibernate4.3和Spring4.2

    SSH框架網(wǎng)上商城項(xiàng)目第1戰(zhàn)之整合Struts2、Hibernate4.3和Spring4.2

    SSH框架網(wǎng)上商城項(xiàng)目第1戰(zhàn)之整合Struts2、Hibernate4.3和Spring4.2,感興趣的小伙伴們可以參考一下
    2016-05-05

最新評論

原平市| 开鲁县| 高要市| 邢台县| 尚义县| 荃湾区| 清镇市| 洪泽县| 乐至县| 德令哈市| 阜新| 武功县| 灯塔市| 吴江市| 濮阳市| 永昌县| 故城县| 原平市| 基隆市| 福贡县| 图木舒克市| 通道| 张家口市| 汉沽区| 溧水县| 崇信县| 肃南| 荣昌县| 北宁市| 汾阳市| 壤塘县| 崇信县| 晋江市| 沙湾县| 灵山县| 遂川县| 平利县| 南澳县| 武汉市| 长乐市| 郑州市|