[Java] 封裝

目錄

1. 什么是封裝?

2. 訪問修飾符

3. 封裝的好處

4. 封裝的步驟

5. 包

5.1 什么是包

5.2 導入包中的類

5.3 自定義包

5.4 常用的包

6. static關鍵字

6.1 static修飾成員變量

6.2 static修飾成員方法

6.3 Static修飾成員變量初始化

7. 代碼塊

7.1 普通代碼塊

7.2 構造代碼塊

7.3 靜態代碼塊

7.4 各種初始化

8. 對象的打印


1. 什么是封裝?

封裝就是對類里面的成員變量和成員方法進行隱藏,只能在所在類的范圍內使用,只留下一些可以被外部訪問的方法,供外部調用,隱藏方法實現的內部細節。

這就好比一臺電視機,給你提供了一個遙控器供你使用,進行一系列操作,但是操作的內部細節你看不到,只是通過遙控器來實現功能。

2. 訪問修飾符

Java當中是通過類和訪問權限來實現封裝的,類可以實現數據和封裝的數據存儲在一起,而訪問修飾符則可以設置數據的訪問權限。

訪問限定符有四個:private , default , protected , public 。它們的訪問權限也是不一樣的。如圖所示:

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

3. 封裝的好處

1.可以隱藏類內部的實現細節。

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

4. 封裝的步驟

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

2. 設置public的set方法實現對私有的屬性的判斷和賦值。

3. 設置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());}
}

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

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

1.鼠標在類內部右擊找到下面的選項:

2. 找到下面選項:?

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

?這樣就實現了間接訪問成員變量。

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

????????因為,封裝的屬性和方法是為類內部的其他方法提供的,而設置的一些公共類的方法就可以被外部所訪問,而這個方法有可以使用封裝的屬性和方法,這樣既隱藏了封裝的方法的內部細節,又可以通過公共方法給外部間接使用。

5. 包

5.1 什么是包

????????包本質上是對類的一種管理形式,包里面包含了很多的類,也就相當于包是一個文件夾,里面存放了很多的.Java文件,一個.Java文件對應一個類。

5.2 導入包中的類

這里我們可以用到import關鍵字進行導入包,也成為打包。例如:

import java.util.Arrays;

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

當然我們也可以不導入包直接在代碼中使用,如下:

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

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

當然還有一種寫法是: *叫做通配符

import java.util.*;

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

????????這種方法可以導入包里面的全部類,但是不建議這樣書寫。因為有可能在兩個包里面會有相同名字的類,這樣書寫就會導致沖突,編譯器會報錯。

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

因為這樣的話,在代碼中使用時,編譯器無法識別是哪一個包下面的類,所以遇到這種情況,只能用import導入一個類,另一個類則需要在使用的時候進行導入。如圖:

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

5.3 自定義包

創建一個包:

包的命必須是字母,數字,點號,下劃線,數字不能開頭,不能包含關鍵字。

一般公司命名是以 com.公司名.項目名.模塊名 來命名的。

回車后就創建好了一個包:

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

Test1類里面代碼如下:

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

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

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

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

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

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

5.4 常用的包

java.lang? ? lang是基本包,默認引入的,不需要再導入。

java.util? ? ? 系統提供的工具包,包含工具類。

java.net? ? ? 網絡開發用的。

java.awt? ?做Java的頁面開發的。

6. static關鍵字

static是用來修飾成員的,被static修飾的成員叫做靜態成員,也叫做類成員,表示該成員不屬于任何一個對象的,而是所有對象共同包含成員。我用下面的代碼幫助大家理解:

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");}
}

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

6.1 static修飾成員變量

當static修飾完成員變量后,該成員變量就屬于類的變量,而不是方法的變量,此時該靜態變量就不會在根據類的定義在堆區申請的對象的內存空間中了,而是在方法區中了。如下圖所示關系:

此時我們如何訪問靜態變量呢?

有兩種方式:

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

第一種是通過對象的引用來訪問,但是不建議使用,因為靜態變量不在對象申請的內存中,在方法區中,屬于類的變量。

第二種是通過類名來訪問。

注意:

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

6.2 static修飾成員方法

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

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();}
}

方法一:是通過對象來訪問,這種方法雖然不會報錯,但是不建議使用,因為靜態方法屬于類方法,不依賴于對象。

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

注意:

  • 靜態方法里面不能使用this關鍵字,因為this關鍵字依賴于對象,而靜態方法的訪問不依賴于對象。
  • 靜態方法不能直接訪問非靜態方法和非靜態變量,但可以通過對象的實例化間接訪問。
  • 非靜態方法可以直接訪問靜態方法和靜態變量,非靜態方法依賴于對象,靜態方法和靜態變量不依賴于對象。
  • 不同類間訪問靜態方法或靜態變量,通過類名.方法名或變量名訪問。
  • 不同類間訪問非靜態方法或非靜態變量,對象實例化后,通過對象來訪問。
  • static不能修飾局部變量。

6.3 Static修飾成員變量初始化

靜態成員方法初始化方法有四種:

  1. 通過就地初始化,也就是直接初始化值。
  2. 通過set方法初始化。
  3. 通過構造方法初始化。
  4. 通過靜態代碼塊初始化

7. 代碼塊

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

7.1 普通代碼塊

這是定義在方法內的代碼塊:

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

7.2 構造代碼塊

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

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

7.3 靜態代碼塊

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

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

靜態代碼塊只能初始化靜態成員變量。因為非靜態對象初始化依賴于對象。?

7.4 各種初始化

我們已經知道了 用構造方法來初始化成員變量,還有就地初始化成員變量,還有代碼塊初始化成員變量,代碼塊又分為靜態代碼塊和實例代碼塊。

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

多個靜態代碼塊或者多個實例代碼塊同時初始化,則是按照代碼的先后順序初始化。

靜態代碼塊是在類加載時執行的,而構造方法和實例初始化則是在實例化對象時執行的,所以靜態代碼塊先執行,如果有靜態變量就地初始化,會按照先后順序進行執行,而實例初始化比構造方法先執行。

一般成員變量的定義和初始化先寫,在寫其他的代碼塊或者方法。

執行順序為:就地初始化->靜態代碼塊->實例代碼塊->構造方法。

????????如果實例化多個對象時,由于類只會在第一次實例化對象時加載一次,也就是說靜態代碼塊只執行一次,第二次實例化對象時,不執行靜態代碼塊,只執行實例代碼塊和構造方法。

8. 對象的打印

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

這里idea提供了一種快捷方式,生成toString方法來進行打印:

class Student {public String name = "張三";public int age = 18;public String sex = "男";//打印成員變量的方法:@Overridepublic 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);}
}

打印結果如下:

這樣就可以實現快速打印對象的屬性。

如果不寫toString方法,默認打印的是地址。當然這種快捷方式不能生成靜態成員變量。?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/82195.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/82195.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/82195.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Axure元件動作五:設置列表選中項

親愛的小伙伴,在您瀏覽之前,煩請關注一下,在此深表感謝!如有幫助請訂閱專欄! Axure產品經理精品視頻課已登錄CSDN可點擊學習https://edu.csdn.net/course/detail/40420 演示視頻: Axure設置列表選中項 課程主題:設置列表選中項 主要內容:下拉列表選項、值、變量值、焦…

Spring框架--IOC技術

一、Spring框架的介紹 1、Spring框架的概述 Spring 是一個開放源代碼的設計層面框架,它解決的是業務邏輯層和其他各層的松耦合問題,因此它將面向接口的編程思想貫穿整個系統應用。Spring是于2003年興起的一個輕量級的Java開發框架,由 Rod Jo…

Flannel后端為UDP模式下,分析數據包的發送方式——tun設備(三)

在分析 Kubernetes 環境中 Flannel UDP 模式的數據包轉發時,我們提到 flannel.1 是一個 TUN 設備,它在數據包處理中起到了關鍵作用。 什么是 TUN 設備? TUN 設備(Tunnel 設備)是 Linux 系統中一種虛擬網絡接口&#x…

2025深圳國際無人機展深度解析:看點、廠商與創新亮點

2025深圳國際無人機展深度解析:看點、廠商與創新亮點 1.背景2.核心看點:技術突破與場景創新2.1 eVTOL(飛行汽車)的規模化展示2.2 智能無人機與無人值守平臺2.3 新材料與核心零部件革新2.4 動態演示與賽事活動 3.頭部無人機廠商4.核…

【Jitsi Meet】(騰訊會議的平替)Docker安裝Jitsi Meet指南-使用內網IP訪問

Docker安裝Jitsi Meet指南-使用內網IP訪問 下載官方代碼配置環境變量復制示例環境文件并修改配置:編輯 .env 文件: 修改 docker-compose.yml 文件生成自簽名證書啟動服務最終驗證 騰訊會議的平替。我們是每天開早晚會的,都是使用騰訊會議。騰…

使用Spring Boot和Spring Security結合JWT實現安全的RESTful API

使用Spring Boot和Spring Security結合JWT實現安全的RESTful API 引言 在現代Web應用中,安全性是至關重要的。Spring Boot和Spring Security提供了強大的工具來保護我們的應用程序,而JWT(JSON Web Token)則是一種輕量級的認證和…

對神經正切核的理解和推導(1)

聲明: 本文是對Neural Tangent Kernel (NTK)基礎推導 - Gearlesskai - 博客園文章內容的理解與推導,里面很多東西對我這種新手來說不太好理解,所以我力求通過這種方式理解文章的大部分內容。希望我的理解可以幫助你更…

基于 STC89C52 的養殖場智能溫控系統設計與實現

摘要 本文提出一種基于 STC89C52 單片機的養殖場環境溫度智能控制系統,通過集成高精度溫度傳感器、智能執行機構及人機交互模塊,實現對養殖環境的實時監測與自動調控。系統具備溫度閾值設定、超限報警及多模式控制功能,可有效提升養殖環境穩定性,降低能耗與人工成本。 一…

微信小程序調試

一、尋找答案 1. 創建小程序 https://zhuanlan.zhihu.com/p/1906013675883561860 2. 若有后端接口,需要調試 https://blog.csdn.net/animatecat/article/details/126949749 3. 比較細教程, 搭建修改配置 https://zhuanlan.zhihu.com/p/1893281527112136235 4. 查找…

使用DeepSeek實現數據處理

一、核心能力全景圖 Ctrl+/ 喚醒智能助手,支持以下數據處理場景: ?? 數據清洗與預處理?? 統計分析與可視化?? 機器學習建模?? 大數據性能優化?? 自動化報告生成? 實時流數據處理二、高頻場景實戰(附魔法口令) 場景1:數據清洗自動化(Python示例) 口令: 處…

符合Python風格的對象(使用 __slots__ 類屬性節省空間)

使用__slots__ 類屬性節省空間 默認情況下,Python 在各個實例中名為__dict__ 的字典里存儲實例屬 性。如 3.9.3 節所述,為了使用底層的散列表提升訪問速度,字典會消 耗大量內存。如果要處理數百萬個屬性不多的實例,通過__slots__…

民宿管理系統5

管理員管理&#xff1a; 新增管理員信息&#xff1a; 前端效果&#xff1a; 前端代碼&#xff1a; <body> <div class"layui-fluid"><div class"layui-row"><div class"layui-form"><div class"layui-form-i…

?騰訊地圖軌跡云:重構位置管理的數字神經中樞

——從軌跡追蹤到智能決策&#xff0c;開啟產業互聯網新篇章 在數字經濟與實體經濟深度融合的今天&#xff0c;位置服務已成為企業數字化轉型的核心基礎設施。無論是物流運輸中的車輛調度、共享經濟中的設備管理&#xff0c;還是智慧城市中的交通優化&#xff0c;精準的軌跡數…

rce命令執行原理及靶場實戰(詳細)

2. 原理 在根源上應用系統從設計上要給用戶提供一個指定的遠程命令操作的接口。漏洞主要出現在常見的路由器、防火墻、入侵檢測等設備的web管理界面上。在管理界面提供了一個ping服務。提交后&#xff0c;系統對該IP進行ping&#xff0c;并且返回結果。如果后臺服務器并沒有對…

GeoTools 將 Shp 導入PostGIS 空間數據庫

前言 ? GeoTools 在空間數據轉換處理方面具有強大的能力&#xff0c;能夠高效、簡潔的操縱 Shp 數據。特別是與空間數據庫PostGIS 相結合&#xff0c;更能展示出其空間數據處理的優勢&#xff0c;借助 GeoTools&#xff0c;我們可以實現 Shp 數據高效入庫。 本文上接系列文章 …

基于SpringBoot+Vue的家政服務系統源碼適配H5小程序APP

市場前景 隨著社會經濟的發展和人口老齡化的加劇&#xff0c;家政服務需求不斷增長。我國65歲及以上人口增長較快&#xff0c;2022年我國65歲及以上老年人數量達2.1億人&#xff0c;占比較2016年增長4.1個百分點&#xff0c;達14.9%。我國65歲及以上人口數量龐大&#xff0c;老…

《企業級日志該怎么打?Java日志規范、分層設計與埋點實踐》

大家好呀&#xff01;&#x1f44b; 今天我們要聊一個Java開發中超級重要但又經常被忽視的話題——日志系統&#xff01;&#x1f4dd; 不管你是剛入門的小白&#xff0c;還是工作多年的老司機&#xff0c;日志都是我們每天都要打交道的"好朋友"。那么&#xff0c;如…

1Panel vs 寶塔面板:現代化運維工具的全方位對比

1Panel vs 寶塔面板對比分析 1Panel 和 寶塔面板&#xff08;BT-Panel&#xff09;都是服務器管理工具&#xff0c;旨在簡化 Linux 服務器的運維工作&#xff0c;但它們在設計理念、功能側重點和技術實現上有明顯差異。以下從多個維度對兩者進行對比分析&#xff1a; 1. 定位與…

怎么開發一個網絡協議模塊(C語言框架)之(四) 信號量初始化

// 原始代碼 /* gVrrpInstance.sem = OsixCreateBSem(OSIX_SEM_Q_PRIORITY, OSIX_SEM_FULL); */ gVrrpInstance.sem = OsixCreateMSem(OSIX_SEM_Q_FIFO | OSIX_SEM_DELETE_SAFE); if (gVrrpInstance.sem == NULL) {printf("[VRRP]:vrrp init error, failed to create vrrp…

電腦C盤清理技巧:釋放空間,提升性能

文章目錄 一、使用系統自帶的磁盤清理工具&#xff08;一&#xff09;打開磁盤清理工具&#xff08;二&#xff09;清理臨時文件&#xff08;三&#xff09;清理系統文件 二、使用第三方清理工具&#xff08;一&#xff09;CCleaner&#xff08;極力推薦&#xff09;&#xff0…