個(gè)人主頁(yè):兜里有顆棉花糖
歡迎 點(diǎn)贊?? 收藏? 留言? 加關(guān)注??本文由 兜里有顆棉花糖 原創(chuàng)
收錄于專欄【JavaSE_primary】
本專欄旨在分享學(xué)習(xí)Java的一點(diǎn)學(xué)習(xí)心得,歡迎大家在評(píng)論區(qū)討論??
一、封裝
1.1什么是封裝
封裝概念:將數(shù)據(jù)和對(duì)數(shù)據(jù)的操作封裝在一個(gè)類中,對(duì)外部的訪問只通過類提供的接口進(jìn)行。
封裝目的:隱藏類的內(nèi)部實(shí)現(xiàn)細(xì)節(jié),只公開必要的方法來操作數(shù)據(jù),避免數(shù)據(jù)被外部直接訪問和修改,從而提高代碼的安全性和可維護(hù)性。
那java是如何控制對(duì)數(shù)據(jù)的訪問權(quán)限呢,答案是訪問修飾符。通過訪問修飾符,可以控制對(duì)數(shù)據(jù)的訪問權(quán)限,以確保代碼的安全性和封裝性。
1.2訪問修飾符
java中主要有以下四種訪問修飾符:
加粗樣式
- public:公共訪問修飾符,可以被任何其他類或代碼訪問。
- protected:受保護(hù)的訪問修飾符,可以被同一包內(nèi)的類、子類以及其他包中的子類訪問。
- default(默認(rèn)):沒有顯式指定訪問修飾符時(shí),默認(rèn)的訪問修飾符,可以被同一包中的類訪問。
- private:私有訪問修飾符,只能被所屬類的內(nèi)部訪問。
二、封裝拓展之包
2.1包的概念
在面向?qū)ο篌w系中,提出了一個(gè)軟件包的概念,即:為了更好的管理類,把多個(gè)類收集在一起成為一組,稱為軟件包。
2.2導(dǎo)入包中的類
在Java中,你可以使用import關(guān)鍵字來導(dǎo)入其他包中的類。導(dǎo)入包中的類可以讓你在當(dāng)前文件中直接使用這些類而無(wú)需使用完整的包名來引用它們。
比如,我們想要導(dǎo)入java.util包中的Date類。即import java.util.Date
。
public class Test3 {
public static void main(String[] args) {
java.util.Date date = new java.util.Date();
// 得到一個(gè)毫秒級(jí)別的時(shí)間戳
System.out.println(date.getTime());
}
}
這里如果需要使用 java.util
中的其他類,,可以使用 import java.util.*
需要注意的是:import java.util.*
中的*
代表導(dǎo)入‘java.util’包下的所有類,從而使所有類都可以在代碼中直接使用。同時(shí)這里并不是一次性把java.util包下的所有類都導(dǎo)入進(jìn)來,而是用到哪個(gè)類才導(dǎo)入哪個(gè)類(即用到誰(shuí)導(dǎo)入誰(shuí))。
并不是只有 java.util包
才有Date類,java.sql包
中也是有Date類的。
2.3自定義包
在Java中,我們可以創(chuàng)建自己的包來組織和管理你的類文件。
創(chuàng)建和使用自定義包的一般步驟如下:
1.創(chuàng)建包目錄結(jié)構(gòu):在我們的項(xiàng)目或源代碼目錄下,創(chuàng)建一個(gè)與我們的包名相對(duì)應(yīng)的目錄結(jié)構(gòu)。例如,如果我們的包名是com.example.mypackage
,那么你應(yīng)該創(chuàng)建一個(gè)目錄結(jié)構(gòu)為com/example/mypackage
的文件夾。
2.編寫類文件:在包目錄結(jié)構(gòu)下,創(chuàng)建你的類文件。例如,在com/example/mypackage目錄下,你可以創(chuàng)建一個(gè)名為MyClass.java的文件,并在其中定義你的類。
3.聲明包名:在你的類文件的開頭,使用package關(guān)鍵字來聲明你的包名。例如,在MyClass.java
中,你可以添加如下的包聲明:package com.example.mypackage;
4.導(dǎo)入和使用包中的類:如果你在另一個(gè)Java文件中想要使用你的包中的類,可以使用import語(yǔ)句導(dǎo)入該類。例如,如果你想在Main.java
中使用MyClass
類:
import com.example.mypackage.MyClass;
public class Main {
public static void main(String[] args) {
MyClass myObject = new MyClass();
// 使用myObject進(jìn)行操作
}
}
三、static成員
在Java中,被static修飾的成員,稱之為靜態(tài)成員,也可以稱為類成員,其不屬于某個(gè)具體的對(duì)
象,是所有對(duì)象所共享的。
舉個(gè)例子,我們以學(xué)生類進(jìn)行舉例,現(xiàn)在有10個(gè)學(xué)生,這10個(gè)學(xué)生中都是在同一個(gè)班級(jí),所以我們此時(shí)就不需要再學(xué)生類中寫一個(gè)成員變量來保存學(xué)生所處的班級(jí),我們可以把班級(jí)理解為這些學(xué)生的共同屬性,即所有學(xué)生所共享的一個(gè)屬性。所以我們當(dāng)然不需要在每個(gè)學(xué)生類對(duì)象中都要存儲(chǔ)一份這樣的屬性,因?yàn)檫@個(gè)班級(jí)屬性是每個(gè)學(xué)生所共享的。
3.1static修飾成員變量
static修飾的成員變量,稱為靜態(tài)成員變量,靜態(tài)成員變量最大的特性:不屬于某個(gè)具體的對(duì)象,是所有對(duì)象所共享的。
靜態(tài)成員變量的特性如下:
- 靜態(tài)成員變量不屬于某個(gè)具體的對(duì)象,是類的屬性,所有對(duì)象共享的,不存儲(chǔ)在某個(gè)對(duì)象的空間中。
- 既可以通過對(duì)象訪問,也可以通過類名訪問,但一般更推薦使用類名訪問
- 類變量存儲(chǔ)在方法區(qū)當(dāng)中
- 靜態(tài)成員變量的生命周期隨類的加載而創(chuàng)建,隨類的卸載而銷毀
如果要為成員變量進(jìn)行賦值的話,我們?nèi)缦聢D可以直接為靜態(tài)成員變量進(jìn)行賦值即可。
3.2靜態(tài)成員方法的訪問
靜態(tài)成員方法的訪問是通過類名來進(jìn)行訪問的。
下面是靜態(tài)成員方法的特性:
- 靜態(tài)成員方法不屬于某個(gè)具體的對(duì)象,是類方法
- 靜態(tài)成員方法通過類名去進(jìn)行訪問,當(dāng)然如果通過對(duì)象去訪問也是可以的,只不過更推薦通過類名去進(jìn)行訪問
- 不能直接訪問靜態(tài)方法中的任何非靜態(tài)成員變量和非靜態(tài)成員方法
綜上,靜態(tài)的無(wú)論是靜態(tài)成員變量還是靜態(tài)成員函數(shù)都是不依賴于對(duì)象的,它們都是可以通過類名去進(jìn)行訪問的。
3.3static成員變量的初始化
靜態(tài)成員變量一般不會(huì)放在構(gòu)造方法中來初始化,構(gòu)造方法中初始化的是與對(duì)象相關(guān)的實(shí)例屬性
靜態(tài)成員變量的初始化分為兩種:就地初始化和靜態(tài)代碼塊初始化。
就地初始化:在定義時(shí)直接給出初始值。
請(qǐng)看舉例:
代碼塊初始化:
四、代碼塊
使用 {}
定義的一段代碼稱為代碼塊。根據(jù)代碼塊定義的位置以及關(guān)鍵字,又可分為以下四種:
實(shí)例代碼塊、靜態(tài)代碼塊、局部代碼塊、同步代碼塊。
下面來看下述代碼:
public class MyStudent {
public String name;
public int age;
public int ID;
public static String classes = "classone";
{
System.out.println("實(shí)例代碼塊");
}
static {
System.out.println("靜態(tài)代碼塊");
}
public MyStudent(){
this("李華",18,123456);
System.out.println("不帶參數(shù)的構(gòu)造函數(shù)");
}
public MyStudent(String name,int age,int ID){
System.out.println("帶參數(shù)的構(gòu)造函數(shù)");
this.name = "Daming";
this.age = 21;
this.ID = 123456;
}
public static void main(String[] args) {
MyStudent s1 = new MyStudent();
}
}
看下圖代碼的執(zhí)行結(jié)果:
由此可以看出static修飾的成員變量在對(duì)象創(chuàng)建之前就已經(jīng)創(chuàng)建完成了,所以static修飾的成員變量和成員方法加載的速度比較快。
實(shí)例代碼塊、靜態(tài)代碼塊、局部代碼塊、同步代碼塊的執(zhí)行順序如下:
1.靜態(tài)代碼塊:靜態(tài)代碼塊首先在類加載時(shí)執(zhí)行,只會(huì)執(zhí)行一次,并在類加載后執(zhí)行。它用于初始化類的靜態(tài)成員變量或執(zhí)行其他靜態(tài)初始化操作。
2.實(shí)例代碼塊:實(shí)例代碼塊在每次創(chuàng)建對(duì)象時(shí)都會(huì)被執(zhí)行。它在構(gòu)造方法之前執(zhí)行,并且不管調(diào)用哪個(gè)構(gòu)造方法,都會(huì)執(zhí)行實(shí)例初始化塊。
3.構(gòu)造方法(Constructor):構(gòu)造方法用于創(chuàng)建對(duì)象并對(duì)實(shí)例變量進(jìn)行初始化。構(gòu)造方法的執(zhí)行順序由具體調(diào)用的構(gòu)造方法決定。
4.局部代碼塊:局部代碼塊是在方法或條件語(yǔ)句內(nèi)部定義的代碼塊。它在程序運(yùn)行到該代碼塊時(shí)被執(zhí)行。
5.同步代碼塊(Synchronized Block):同步代碼塊使用關(guān)鍵字包裹一段代碼,用于實(shí)現(xiàn)線程同步。當(dāng)線程進(jìn)入同步代碼塊時(shí),需要獲取鎖,其它線程需要等待鎖釋放才能執(zhí)行。
注意事項(xiàng)如下:
1.靜態(tài)代碼塊不管生成多少個(gè)對(duì)象,其只會(huì)執(zhí)行一次
2.靜態(tài)成員變量是類的屬性,因此是在JVM加載類時(shí)開辟空間并初始化的
3.如果一個(gè)類中包含多個(gè)靜態(tài)代碼塊,在編譯代碼時(shí),編譯器會(huì)按照定義的先后次序依次執(zhí)行(合并)
4.實(shí)例代碼塊只有在創(chuàng)建對(duì)象時(shí)才會(huì)執(zhí)行
總之:靜態(tài)代碼塊只在類加載時(shí)執(zhí)行一次,而實(shí)例代碼塊(在構(gòu)造方法之前執(zhí)行
)在每次創(chuàng)建對(duì)象時(shí)都會(huì)執(zhí)行。局部代碼塊和同步代碼塊在程序運(yùn)行到相應(yīng)的位置時(shí)才會(huì)執(zhí)行。構(gòu)造方法在創(chuàng)建對(duì)象時(shí)被調(diào)用,并且可以根據(jù)具體的構(gòu)造方法決定執(zhí)行順序。
以上就是本文的全部?jī)?nèi)容。文章來源:http://www.zghlxwxcb.cn/news/detail-706955.html
好了,友友們,本文到這里就結(jié)束了,再見啦?。?!文章來源地址http://www.zghlxwxcb.cn/news/detail-706955.html
到了這里,關(guān)于【Java基礎(chǔ)篇 | 面向?qū)ο蟆俊?封裝詳解的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!