JavaSE——類和對象(二)~~封裝

目錄

一.封裝

二.封裝擴展之包

三.static成員

四.?代碼塊

五.?內部類(重要)


大家好呀,我是北緯,接著上節我們繼續講解Java中關于類和對象的相關知識,今天著重給大家介紹一下關于面向對象程序的特性之一——封裝。

一.封裝

1.什么是封裝

封裝是面向對象程序三大特性之一,面向對象程序有三大特性:封裝、繼承、多態。而類和對象階段,主要研究的就是封裝特性,何為封裝呢?簡單來說就是套殼屏蔽細節
類比一下比如說:對于電腦這樣一個復雜的設備,提供給用戶的就只是:開關機、通過鍵盤輸入,顯示器,USB插孔等,讓用戶來和計算機進行交互,完成日常事務。但實際上電腦真正工作的卻是CPU、顯卡、內存等一些硬件元件。

封裝:將數據和操作數據的方法進行有機結合,隱藏對象的屬性和實現細節,僅對外公開接口來和對象進行交互。
2.訪問限定符

Java中主要通過類和訪問權限來實現封裝:類可以將數據以及封裝數據的方法結合在一起,更符合人類對事物的認知,而訪問權限用來控制方法或者字段能否直接在類外使用。Java中提供了四種訪問限定符:
【說明】:

? ? ? ? ? 1.private同一包中的同一類,也就相當于自己的秘密只有自己知道,所以被private修? ? ? ? ? ? ? ?飾的成員變量和方法只能在本類中的成員方法中可以調用。

? ? ? ? ? 2.default是什么都不寫時的默認權限,同一包中的不同類,被default修飾的成員方法? ? ? ? ? ? ? ?和成員變量在同一個包中可以被其他類中的成員方法調用。? ?
? ? ? ? ? 3.protected主要是用在繼承中,后期會有詳細講解這里就不贅述了。
? ? ? ? ? 4.?訪問權限除了可以限定類中成員的可見性,也可以控制類的可見性。

3.如何實現封裝

使用private關鍵字對類里面的成員變量進行隱藏,這里可以利用settergetter方法對隱藏的成員變量進行訪問。

代碼示例:

【說明】:這里的settergetter方法可以借助我們的編譯器idea自動生成。

二.封裝擴展之包


1 .包的概念

在面向對象體系中,提出了一個軟件包的概念,即:為了更好的管理類,把多個類收集在一起成為一組,稱為軟件包。有點類似于目錄。比如:為了更好的管理電腦中的歌曲,一種好的方式就是將相同屬性的歌曲放在相同文件下,也可以對某個文件夾下的音樂進行更詳細的分類。
在Java中引入了包,包是對類、接口等的封裝機制的體現是一種對類或者接口等的很好的組織方式。包還有一個重要的作用:在同一個工程中允許存在相同名稱的類,只要處在不同的包中即可
2.導入包中的類

Java 中已經提供了很多現成的類供我們使用。例如Date類:可以使用 java.util.Date 導入java.util 這個包中的 Date類,但是這種寫法比較麻煩一些,可以使用 import語句導入包。


import java.util.Date;
public class Test {
public static void main(String[] args) {
Date date = new Date();
// 得到一個毫秒級別的時間戳
System.out.println(date.getTime());
}
}

如果需要使用 java.util 中的其他類, 可以使用 import java.util.*


import java.util.*;
public class Test {
public static void main(String[] args){
Date date = new Date();
// 得到一個毫秒級別的時間戳
System.out.println(date.getTime());}
}

但是我們更建議顯式的指定要導入的類名,否則還是容易出現沖突的情況。也可以使用import static導入包中靜態的方法和字段。


import static java.lang.Math.*;
public class Test {
public static void main(String[] args){
double x = 30;
double y = 40;
// 靜態導入的方式寫起來更方便一些.
// double result = Math.sqrt(Math.pow(x, 2) + Math.pow(y, 2));
double result = sqrt(pow(x, 2) + pow(y, 2));
System.out.println(result);}
}

注意事項: import C++#include 差別很大。C++ 必須 #include 來引入其他文件內容, 但是 Java 不需要。import 只是為了寫代碼的時候更方便?import 更類似于 C++ 的 namespace 和using
3.如何自定義包

基本規則:

?1.在文件的最上方加上一個 package 語句指定該代碼在哪個包中。
?2.包名需要盡量指定成唯一的名字, 通常會用公司的域名的顛倒形式(例com.baidu.demo1? )。
?3.包名要和代碼路徑相匹配。例如創建 com.baidu.demo1 的包, 那么會存在一個對應的路? ? ?徑?com/bit/demo1來存儲代碼。
?4.如果一個類沒有 package 語句, 則該類被放到一個默認包中。

操作步驟
? ? ? ? ? ? ??1. 在 IDEA 中先新建一個包: 右鍵 src -> 新建 -> 包。

? ? ? ? ? ? ? 2. 在彈出的對話框中輸入包名, 例如 com.bite.demo1。
? ? ? ? ? ? ? 3. 在包中創建類, 右鍵包名 -> 新建 -> 類, 然后輸入類名即可。
? ? ? ? ? ? ? 4. 此時我們可以看到, 在新創建的 Test.java 文件的最上方, 就出現了一個 package 語句

三.static成員

1.static修飾成員變量

在Java中,被static修飾的成員,稱之為靜態成員,也可以稱為類成員,其最大的特性就是不屬于某個具體的對象,是所有對象所共享的。

【靜態成員變量特性】
? ? ? ? ? 1. 不屬于某個具體的對象,是類的屬性,所有對象共享的,不存儲在某個對象的空間中。
? ? ? ? ? 2. 既可以通過對象訪問,也可以通過類名訪問,但一般更推薦使用類名訪問。
? ? ? ? ? 3. 類變量存儲在方法區當中。
? ? ? ? ? 4. 生命周期伴隨類的一生(即:隨類的加載而創建,隨類的卸載而銷毀)。

public class Student{
public String name;
public String gender;
public int age;
public double score;
public static String classRoom = "Bit306";
// ...
public static void main(String[] args) {
// 靜態成員變量可以直接通過類名訪問
System.out.println(Student.classRoom);
Student s1 = new Student("Li leilei", "男", 18, 3.8);
Student s2 = new Student("Han MeiMei", "女", 19, 4.0);
Student s3 = new Student("Jim", "男", 18, 2.6);
// 也可以通過對象訪問:但是classRoom是三個對象共享的
System.out.println(s1.classRoom);
System.out.println(s2.classRoom);
System.out.println(s3.classRoom);}
}

大家可以以調試的方式運行上述代碼,然后在監視窗口中可以看到,靜態成員變量并沒有存儲到某個具體的對象中。

2.static修飾成員方法

Java中,被static修飾的成員方法稱為靜態成員方法,是類的方法,不是某個對象所特有的,靜態成員一般是通過靜態方法來訪問的。


【靜態方法特性】
? ? ? ? ? ? ? 1. 不屬于某個具體的對象,是類方法。
? ? ? ? ? ? ? 2. 可以通過對象調用,也可以通過類名.靜態方法名(..)方式調用,更推薦使用后者。
? ? ? ? ? ? ? 3. 不能在靜態方法中訪問任何非靜態成員變量。
? ? ? ? ? ? ? 4. 靜態方法中不能調用任何非靜態方法,因為非靜態方法有this參數,在靜態方法? ? ? ? ? ? ? ? ? ? ? 中調用時無法傳遞this引用。
? ? ? ? ? ? ? 5. 靜態方法無法重寫,不能用來實現多態

public static String getClassRoom(){
doClass();
return classRoom;
}

上述程序就會編譯錯誤,因為無法從靜態方法中引用非靜態方法 doClass()。

四.代碼塊


1. 代碼塊概念以及分類
使用 {} 定義的一段代碼稱為代碼塊。根據代碼塊定義的位置以及關鍵字,又可分為以下四種即普通代碼塊,構造代碼塊,靜態代碼塊,同步代碼塊。
普通代碼塊用的較少這里重點介紹一下構造代碼塊和靜態代碼塊,同步代碼塊后期會講到。

2. 構造代碼塊
構造代碼塊:定義在類中的代碼塊(不加修飾符),也叫:實例代碼塊,構造代碼塊一般用于初始化實例成員變量。


//實例代碼塊
{
this.name = "beiwei";
this.age = 20;
this.sex = "man";
System.out.println("實例代碼塊!");
}

3. 靜態代碼塊
使用static定義的代碼塊稱為靜態代碼塊,一般用于初始化靜態成員變量。
代碼示例:

注意事項:

? ? ? ?1.?靜態代碼塊不管生成多少個對象,其只會執行一次
? ? ? ?2.?靜態成員變量是類的屬性,因此是在JVM加載類時開辟空間并初始化的。
? ? ? ?3.如果一個類中包含多個靜態代碼塊,在編譯代碼時,編譯器會按照定義的先后次序依次執行
? ? ? ?4.?實例代碼塊只有在創建對象時才會執行。


五.?內部類(重要)


當一個事物的內部,還有一個部分需要一個完整的結構進行描述,而這個內部的完整的結構又只為外部事物提供服務,那么這個內部的完整結構最好使用內部類。在 Java 中,可以將一個類定義在另一個類或者一個方法的內部,前者稱為內部類,后者稱為外部類,內部類也是封裝的一種體現
注意:
? ?1. 定義在class 類名{}花括號外部的,即使是在一個文件里,都不能稱為內部類。
? ?2. 內部類和外部類共用同一個java源文件,但是經過編譯之后,內部類會形成單獨的字節碼文件1 .內部類的分類

根據內部類定義的位置不同,一般可以分為這幾種形式,實例內部類,靜態內部類,局部內部類。

public class OutClass {
// 成員位置定義:未被static修飾 --->實例內部類
public class InnerClass1{
} /
/ 成員位置定義:被static修飾 ---> 靜態內部類
static class InnerClass2{
}
public void method(){
// 方法中也可以定義內部類 ---> 局部內部類:幾乎不用
class InnerClass5{}}
}

2.實例內部類
即未被static修飾的成員內部類。

代碼示例:

如何實例化內部類對象,這里語法有點怪異,大家適應一下。

注意:
1. 外部類中的任何成員都可以在實例內部類方法中直接訪問。
2. 實例內部類所處的位置與外部類成員位置相同,因此也受public、private等訪問限定符的約束。
3. 在實例內部類方法中訪問同名的成員時,優先訪問自己的,如果要訪問外部類同名的成員,必須:外部類名稱.this.同名成員 來訪問。
4. 實例內部類對象必須在先有外部類對象前提下才能創建。
5. 實例內部類的非靜態方法中包含了一個指向外部類對象的引用。
6. 外部類中,不能直接訪問實例內部類中的成員,如果要訪問必須先要創建內部類的對象。

3.靜態內部類

被static修飾的內部成員類稱為靜態內部類。

對靜態內部類對象的實例化:

public static void main(String[] args) {OuterClass2.InnerClass2 innerClass2 = new OuterClass2.InnerClass2();  //靜態內部類對象的實例化}

【注意事項】

? ? ? ? ? ?1. 在靜態內部類中只能訪問外部類中的靜態成員。
? ? ? ? ? ?2. 創建靜態內部類對象時,不需要先創建外部類對象。

?

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

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

相關文章

【Linux】常用基礎命令 | 搭建云服務器優化環境 | 程序的部署

文章目錄 Linux常用命令及搭建環境一、LinuxLinux發行版 1.常用命令1.ls2.cd3.pwd4.touch5.cat6.echo7.vim8.mkdir9.rm10.mv11.cp12.man13.grep14.ps15.netstat 2.搭建Java Web程序的運行環境包管理器1.安裝JDK2.安裝Tomcat3.安裝mysql 3.程序的部署 Linux常用命令及搭建環境 …

貪心算法簡單介紹

貪心算法是一種在每一步選擇中都采取當前狀態下最優或最優近似的選擇,以期望最終得到全局最優解的算法。貪心算法并不總能得到全局最優解,但在某些問題上,它可以得到全局最優解,并且比動態規劃等其他方法更為簡單和高效。 貪心算…

Python庫之Scrapy的簡介、安裝、使用方法詳細攻略

Python庫之Scrapy的簡介、安裝、使用方法詳細攻略 簡介 Scrapy是一個快速的、高層次的web抓取和web抓取框架,用于抓取網站數據并從頁面中提取結構化的數據。Scrapy用途廣泛,可以用于數據挖掘、信息處理或存儲歷史數據,以及各種其他用途。 …

【AMS】Android 8.0+ 繞開啟動后臺Service限制

一、背景 應客戶要求,需要在開機時,拉起應用A。但因為開機時,同時被拉起的應用過多,導致Launcher在開機那一刻較為卡頓。為解決這一問題,采取了延遲拉起的做法。在開機后,延遲一定時間,由系統服務,拉起應用A。 于是乎,就出現這么個報錯: Not allowed to start ser…

vue3、vuex和vue-router入門指南

Vue 3、Vuex 和 Vue Router 都是 Vue.js 生態系統中非常有用的庫。它們各自在 Vue.js 應用程序中扮演著重要的角色:Vue 3 是核心框架,Vuex 用于狀態管理,而 Vue Router 用于路由管理。下面是如何在 Vue 3 項目中使用這些庫的簡要說明。 創建…

有趣的css - 移形換位加載動畫

大家好,我是 Just,這里是「設計師工作日常」,今天分享的是一個移形換位動態加載小動效,適用于 app 列表加載,頁面加載或者圖片懶加載等場景。 最新文章通過公眾號「設計師工作日常」發布。 目錄 整體效果核心代碼html…

2024上海初中生古詩文大會倒計時4個月:單選題真題解析(持續)

現在距離2024年初中生古詩文大會還有4個多月時間,我們繼續來看10道選擇題真題和詳細解析,以下題目截取自我獨家制作的在線真題集,都是來自于歷屆真題,去重、合并后,每道題都有參考答案和解析。 為幫助孩子自測和練習&…

C#基礎一

使用Visual Studio 2022(VS2022)編寫C#控制臺程序 1. 安裝Visual Studio 2022 確保已安裝Visual Studio 2022。如果未安裝,請從Visual Studio官網下載并安裝。 另一篇文章中已經有詳細描述,這里就不在細說了。 VisualStudio2022…

【LeetCode】【209】長度最小的子數組(1488字)

文章目錄 [toc]題目描述樣例輸入輸出與解釋樣例1樣例2樣例3 提示進階Python實現前綴和二分查找滑動窗口 個人主頁:丷從心 系列專欄:LeetCode 刷題指南:LeetCode刷題指南 題目描述 給定一個含有n個正整數的數組和一個正整數target找出該數組…

Effective C++(2)

文章目錄 2. 構造、析構、賦值運算條款05:了解C默默編寫并調用哪些函數條款06:若不想使用編譯器自動生成的函數,就該明確拒絕條款07:為多態基類聲明virtual析構函數條款08:別讓異常逃離析構函數條款09:絕不…

微信小程序報錯:notifyBLECharacteristicValueChange:fail:nodescriptor的解決辦法

文章目錄 一、發現問題二、分析問題二、解決問題 一、發現問題 微信小程序報錯:notifyBLECharacteristicValueChange:fail:nodescriptor 二、分析問題 這個提示有點問題,應該是該Characteristic的Descriptor有問題,而不能說nodescriptor。 …

web前端之解決img元素組件自有高度的問題

MENU 前言解決辦法vertical-align 前言 在HTML和CSS中,img元素默認是行內元素(inline element),類似于文本。由于文本有基線(baseline),所以即使是空白的img元素也會占據一定的高度,以便使基線對齊。 解決辦法 要解決這個問題&…

axios如何傳遞數組作為參數,后端又如何接收呢????

前端的參數是一個數組。 前端編寫: 后端接收:

Iterater迭代器和增強for循環

1、Collection接口遍歷元素—Iterator迭代器 看一下下面這張圖片:可以看出Collection接口有一個父接口Iterable,Iterable接口有一個iterator()方法,iterator()方法的類型是Iterator迭代器,實際上當我們使用方法時,返回…

Go語言的pprof工具是如何使用的?

文章目錄 Go語言的pprof工具詳解pprof的使用runtime/pprofnet/http/pprof 快速開始獲取采樣數據通過pprof工具進行性能分析總結 Go語言的pprof工具詳解 Go語言作為一個高性能、高并發的編程語言,對性能優化有著極高的要求。在Go語言的標準庫中,pprof是一…

linux 安全 iptables防火墻 (一)

Linux包過濾防火墻概述 Linux 系統的防火墻 :IP信息包過濾系統,它實際上由兩個組件netfilter 和 iptables組成。 主要工作在網絡層,針對IP數據包。體現在對包內的IP地址、端口、協議等信息的處理上。 兩大組件 netfilter內核組件 iptables應…

blender安裝cats-blender-plugin-0-19-0插件,導入pmx三維模型

UE5系列文章目錄 文章目錄 UE5系列文章目錄前言一、Blender安裝二、cats-blender-plugin-0-19-0插件下載三、下載bmp文件四、在blender2.93中安裝cats-blender-plugin-0-19-0插件 前言 blender本身不支持pmx三維模型,需要用到cats-blender-plugin-0-19-0插件。 一…

構建全面的無障礙學習環境:科技之光,照亮學習之旅

在信息與科技日益發展的當下,為所有人群提供一個包容和平等的學習環境顯得尤為重要,特別是對于盲人朋友而言,無障礙學習環境的構建成為了一項亟待關注與深化的課題。一款名為“蝙蝠避障”的輔助軟件,以其創新的設計理念與實用功能…

Offline RL : Context-Former: Stitching via Latent Conditioned Sequence Modeling

paper 基于HIM的離線RL算法,解決基于序列模型的離線強化學習算法缺乏對序列拼接能力。 Intro 文章提出了ContextFormer,旨在解決決策變換器(Decision Transformer, DT)在軌跡拼接(stitching)能力上的不足…

新定義單片機的說明

新定義的官網是https://www.rdsmcu.com/shop/#/,主要經營的是1T系列的51單片機,之前從他們官網上申請了評估板,自己頁玩了一段時間,不過玩的不多,特開此專欄記錄學習過程,并幫助剛入門的道友快速上手。 我申請的是評估…