Java中的static關(guān)鍵字深入理解
在學(xué)習(xí)Java以來(lái)很長(zhǎng)一段時(shí)間,我都不能理解為什么修飾一個(gè)方法的關(guān)鍵字各不相同,為什么有的方法可以直接調(diào)用,而有的方法需要用對(duì)象才能調(diào)用。毫不夸張的說(shuō),最近一次讓我決定去整理清楚static關(guān)鍵字,是因?yàn)樵趯慾dbc工具類時(shí),其中通過(guò)靜態(tài)代碼塊來(lái)實(shí)現(xiàn)加載驅(qū)動(dòng)才讓我對(duì)它有了新的認(rèn)識(shí)。
通俗來(lái)講,歸為幾點(diǎn):
- 由static關(guān)鍵字修飾的方法或成員變量,不需依賴對(duì)象,就可直接訪問(wèn)。(通過(guò) 類名.方法名() 或 類名.屬性 直接調(diào)用)
- static關(guān)鍵字不會(huì)影響到變量或方法的作用域
- static關(guān)鍵字不允許修飾局部變量
- 靜態(tài)方法中不能使用this
- 無(wú)論方法還是變量:由static修飾的靜態(tài)方法不能訪問(wèn)非靜態(tài)的方法或成員變量,但是反之,非靜態(tài)的方法可以訪問(wèn)靜態(tài)的或非靜態(tài)的。
- static 關(guān)鍵字避免了先要new出對(duì)象的繁瑣和資源消耗,因此常被用在工具類中。
下面來(lái)仔細(xì)介紹以下static關(guān)鍵字的作用,主要為以下四個(gè)方面:
修飾成員變量
static關(guān)鍵字修飾的成員變量稱為靜態(tài)成員變量,也稱靜態(tài)變量。有了靜態(tài)變量與之對(duì)應(yīng)的就是非靜態(tài)變量
- 靜態(tài)變量:被所有對(duì)象共享,內(nèi)存中只有一個(gè)副本,當(dāng)且僅當(dāng)類被初次加載時(shí)被初始化一次
- 非靜態(tài)變量:是對(duì)象擁有的,當(dāng)對(duì)象被創(chuàng)建時(shí)被初始化,內(nèi)存中存在多個(gè)副本且互不影響
public class Test{
public static void main(String[] args) {
System.out.println(Person.name);
System.out.println(new Person().age);
}
}
class Person{
static String name;
int age;
}
修飾方法
static修飾的方法稱為靜態(tài)方法。靜態(tài)方法可以直接調(diào)用類的靜態(tài)變量和其他靜態(tài)方法,不能直接調(diào)用成員變量和非靜態(tài)方法(除非通過(guò)對(duì)象調(diào)用)。
class A {
static {
System.out.println("靜態(tài)代碼塊");
}
static final int i;
int j;
static void method() {
System.out.println(i);//直接訪問(wèn)靜態(tài)變量
System.out.println(new D().j);//靜態(tài)方法中訪問(wèn)非靜態(tài)變量需要通過(guò)對(duì)象調(diào)用
method1();//直接調(diào)用靜態(tài)方法
new D().method2();//靜態(tài)方法中訪問(wèn)非靜態(tài)方法需要通過(guò)對(duì)象調(diào)用
}
static void method1() {
System.out.println(i);//靜態(tài)方法中直接訪問(wèn)靜態(tài)變量
}
void method2() {
System.out.println(i);//非靜態(tài)方法中可以直接訪問(wèn)靜態(tài)變量
}
}
靜態(tài)代碼塊
static修飾的代碼塊叫做靜態(tài)代碼塊。當(dāng)類初次被加載時(shí),會(huì)按照代碼塊順序執(zhí)行一次。用來(lái)優(yōu)化程序。
例如在開頭提到的用在JDBC工具類中,使用靜態(tài)代碼塊來(lái)加載資源,當(dāng)類被初始化時(shí)只執(zhí)行一次。
注:構(gòu)造方法用于對(duì)象的初始化,靜態(tài)代碼塊用于類的初始化操作。
靜態(tài)導(dǎo)包
相比于以上三種,第四種是我之前沒(méi)有接觸過(guò)的。
在用import導(dǎo)入包或者類時(shí),可以用static修飾包名或者類,表示靜態(tài)導(dǎo)入。不同于非static導(dǎo)入,采用static導(dǎo)入包后,在不與當(dāng)前類的方法名沖突的情況下,無(wú)需使用“類名.方法名”的方法去調(diào)用類方法了,直接可以采用"方法名"去調(diào)用類方法,就好像是該類自己的方法一樣使用即可。
public class Test {
static void method1() {
System.out.println("static method1");
}
static void method2() {
System.out.println("static method2");
}
}
靜態(tài)導(dǎo)入之后:
import static com.liu.stuatic.Test.method1;
public class Client {
public static void main(String[] args) {
method1(); // 通過(guò)靜態(tài)導(dǎo)入的方法不需類名直接調(diào)用
StaticTest.method2();
}
}
到此這篇關(guān)于Java中的static關(guān)鍵字深入理解的文章就介紹到這了,更多相關(guān)Java中的static關(guān)鍵字內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SpringBoot使用SSE進(jìn)行實(shí)時(shí)通知前端的實(shí)現(xiàn)代碼
這篇文章主要介紹了SpringBoot使用SSE進(jìn)行實(shí)時(shí)通知前端,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-06-06
mybatis分割字符串并循環(huán),實(shí)現(xiàn)in多個(gè)參數(shù)的操作
這篇文章主要介紹了mybatis分割字符串并循環(huán),實(shí)現(xiàn)in多個(gè)參數(shù)的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-06-06
SpringBoot中使用@scheduled定時(shí)執(zhí)行任務(wù)的坑
本文主要介紹了SpringBoot中使用@scheduled定時(shí)執(zhí)行任務(wù)的坑,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-05-05
springboot?pom文件加入監(jiān)控依賴后沒(méi)有起作用的解決
這篇文章主要介紹了springboot?pom文件加入監(jiān)控依賴后沒(méi)有起作用的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-02-02
Jenkins環(huán)境搭建之下載與安裝過(guò)程
Jenkins是一個(gè)功能強(qiáng)大的應(yīng)用程序,允許持續(xù)集成和持續(xù)交付項(xiàng)目,集成Jenkins可以用于一些測(cè)試和部署技術(shù),對(duì)Jenkins環(huán)境搭建之下載與安裝過(guò)程感興趣的朋友跟隨小編一起看看吧2021-12-12
Java日期時(shí)間與正則表達(dá)式超詳細(xì)整理(適合新手入門)
如果使用得當(dāng),正則表達(dá)式是匹配各種模式的強(qiáng)大工具,下面這篇文章主要給大家介紹了關(guān)于Java日期時(shí)間與正則表達(dá)式超詳細(xì)整理的相關(guān)資料,本文非常適合新手入門,需要的朋友可以參考下2023-04-04

