在學(xué)習(xí)Java以來很長一段時間,我都不能理解為什么修飾一個方法的關(guān)鍵字各不相同,為什么有的方法可以直接調(diào)用,而有的方法需要用對象才能調(diào)用。毫不夸張的說,最近一次讓我決定去整理清楚static關(guān)鍵字,是因為在寫jdbc工具類時,其中通過靜態(tài)代碼塊來實現(xiàn)加載驅(qū)動才讓我對它有了新的認(rèn)識。
通俗來講,歸為幾點:
- 由static關(guān)鍵字修飾的方法或成員變量,不需依賴對象,就可直接訪問。(通過 類名.方法名() 或 類名.屬性 直接調(diào)用)
- static關(guān)鍵字不會影響到變量或方法的作用域
- static關(guān)鍵字不允許修飾局部變量
- 靜態(tài)方法中不能使用this
- 無論方法還是變量:由static修飾的靜態(tài)方法不能訪問非靜態(tài)的方法或成員變量,但是反之,非靜態(tài)的方法可以訪問靜態(tài)的或非靜態(tài)的。
- static 關(guān)鍵字避免了先要new出對象的繁瑣和資源消耗,因此常被用在工具類中。
下面來仔細(xì)介紹以下static關(guān)鍵字的作用,主要為以下四個方面:
修飾成員變量
static關(guān)鍵字修飾的成員變量稱為靜態(tài)成員變量,也稱靜態(tài)變量。有了靜態(tài)變量與之對應(yīng)的就是非靜態(tài)變量
- 靜態(tài)變量:被所有對象共享,內(nèi)存中只有一個副本,當(dāng)且僅當(dāng)類被初次加載時被初始化一次
- 非靜態(tài)變量:是對象擁有的,當(dāng)對象被創(chuàng)建時被初始化,內(nèi)存中存在多個副本且互不影響
1
2
3
4
5
6
7
8
9
10
|
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)方法(除非通過對象調(diào)用)。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
class A { static { System.out.println( "靜態(tài)代碼塊" ); } static final int i; int j; static void method() { System.out.println(i); //直接訪問靜態(tài)變量 System.out.println( new D().j); //靜態(tài)方法中訪問非靜態(tài)變量需要通過對象調(diào)用 method1(); //直接調(diào)用靜態(tài)方法 new D().method2(); //靜態(tài)方法中訪問非靜態(tài)方法需要通過對象調(diào)用 } static void method1() { System.out.println(i); //靜態(tài)方法中直接訪問靜態(tài)變量 } void method2() { System.out.println(i); //非靜態(tài)方法中可以直接訪問靜態(tài)變量 } } |
靜態(tài)代碼塊
static修飾的代碼塊叫做靜態(tài)代碼塊。當(dāng)類初次被加載時,會按照代碼塊順序執(zhí)行一次。用來優(yōu)化程序。
例如在開頭提到的用在JDBC工具類中,使用靜態(tài)代碼塊來加載資源,當(dāng)類被初始化時只執(zhí)行一次。
注:構(gòu)造方法用于對象的初始化,靜態(tài)代碼塊用于類的初始化操作。
靜態(tài)導(dǎo)包
相比于以上三種,第四種是我之前沒有接觸過的。
在用import導(dǎo)入包或者類時,可以用static修飾包名或者類,表示靜態(tài)導(dǎo)入。不同于非static導(dǎo)入,采用static導(dǎo)入包后,在不與當(dāng)前類的方法名沖突的情況下,無需使用“類名.方法名”的方法去調(diào)用類方法了,直接可以采用"方法名"去調(diào)用類方法,就好像是該類自己的方法一樣使用即可。
1
2
3
4
5
6
7
8
9
|
public class Test { static void method1() { System.out.println( "static method1" ); } static void method2() { System.out.println( "static method2" ); } } |
靜態(tài)導(dǎo)入之后:
1
2
3
4
5
6
7
8
|
import static com.liu.stuatic.Test.method1; public class Client { public static void main(String[] args) { method1(); // 通過靜態(tài)導(dǎo)入的方法不需類名直接調(diào)用 StaticTest.method2(); } } |
到此這篇關(guān)于Java中的static關(guān)鍵字深入理解的文章就介紹到這了,更多相關(guān)Java中的static關(guān)鍵字內(nèi)容請搜索服務(wù)器之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持服務(wù)器之家!
原文鏈接:https://blog.csdn.net/smart_1234/article/details/114148512