溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

static關(guān)鍵詞在java中的作用有哪些

發(fā)布時間:2020-12-11 14:46:50 來源:億速云 閱讀:206 作者:Leah 欄目:開發(fā)技術(shù)

這期內(nèi)容當(dāng)中小編將會給大家?guī)碛嘘P(guān)static關(guān)鍵詞在java中的作用有哪些,文章內(nèi)容豐富且以專業(yè)的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。

Static基本規(guī)則:

(1)一個類的靜態(tài)方法只能訪問靜態(tài)屬性。

(2)一個類的靜態(tài)方法不能直接調(diào)用非靜態(tài)方法。

(3)如果訪問權(quán)限允許,static屬性和方法可以使用對象加'.'方式調(diào)用,當(dāng)然也可以使用實例加'.'方式調(diào)用。

(4)靜態(tài)方法中不存在當(dāng)前對象,所以不能使用this,當(dāng)然也不能使用super。

(5)靜態(tài)方法不能被非靜態(tài)方法覆蓋。

(6)構(gòu)造方法不允許被聲明為static的。

static關(guān)鍵詞,可以加在方法上,成員變量上,代碼塊。 類就不要想了。

1. static方法

static方法可以在類沒有實例化的情況話直接訪問。 在靜態(tài)方法中不能訪問類的非靜態(tài)成員變量和非靜態(tài)成員方法,因為非靜態(tài)成員方法/變量都是必須依賴具體的對象才能夠被調(diào)用。

2. static變量

static變量也稱作靜態(tài)變量,靜態(tài)變量和非靜態(tài)變量的區(qū)別是:靜態(tài)變量被所有的對象所共享,在內(nèi)存中只有一個副本,它當(dāng)且僅當(dāng)在類初次加載時會被初始化。而非靜態(tài)變量是對象所擁有的,在創(chuàng)建對象的時候被初始化,存在多個副本,各個對象擁有的副本互不影響。

static成員變量的初始化順序按照定義的順序進行初始化。

static變量只會有一個內(nèi)存空間,雖然后多個實例,但這些實例中的static變量會共享同一個內(nèi)存空間。所以靜態(tài)變量的值發(fā)生變更要格外注意,以免造成不必要的“bug”。

static變量是在類裝載的時候就被初始化的。

3. static代碼塊

可以用來初始化一些成員信息。

public class testClassA {
 public static int val = 1;
 static {
 System.err.println("11:" + val);
 val = 2;
 System.err.println("22:" + val);
 }
 public static int getVal() {
 return val;
 }
}
System.err.println(testClassA.getVal());

結(jié)果:

11:1
22:2
2

4. static內(nèi)部類

為何要用內(nèi)部類?

1). 內(nèi)部類一般只為其外部類使用;

2). 內(nèi)部類提供了某種進入外部類的窗戶;

3). 也是最吸引人的原因,每個內(nèi)部類都能獨立地繼承一個接口,而無論外部類是否已經(jīng)繼承了某個接口。因此,內(nèi)部類使多重繼承的解決方案變得更加完整。

public class ClassA {
 public static String val = "1";
 
 public ClassA() {
 }
 public static class ClassB {//靜態(tài)內(nèi)部類
 public static int bVal = 2;
 }
 
 public class ClassC {
 public ClassC()
 {
 
 }
 
 private void name() {
 System.err.println("abc");
 }
 }
}

5. static靜態(tài)導(dǎo)入

靜態(tài)導(dǎo)包是為了簡化代碼,提高代碼的閱讀性,但是如果濫用閱讀性會很糟糕。

對于靜態(tài)導(dǎo)入,一定要遵循兩個規(guī)則(來自下面的資料):

不使用*(星號)通配符,除非是導(dǎo)入靜態(tài)常量類(只包含常量的類或接口)。
方法名是具有明確、清晰表象意義的工具類。

import static java.lang.System.*;

public class testClass {
 public static void main(String[] args) {
 err.println();//這里就不用system.err.println()了。
 }
}

6. 實現(xiàn)單例

public class ClassA {
 
 private static ClassA instance = null;
 
 public static synchronized ClassA getInstance() {//靜態(tài)方法生成實例 懶漢模式 用到的時候再實例化
 if (instance == null) {
 instance = new ClassA();
 }
 return instance;
 }
 
 public void test() {
 System.err.println(1);
 }
}
public class ClassA {
 
 private static ClassA instance = new ClassA();// 餓漢模式,直接生成實例
 
 public static ClassA getInstance() {
 
 return instance;
 }
 
 public void test() {
 System.err.println(1);
 }
}

//使用volatile關(guān)鍵詞,單例模式最優(yōu)解決方案,不支持舊版jdk

public class ClassA {
 
 private volatile static ClassA instance = null;
 
 public static ClassA getInstance() {
 if (instance == null) {
 synchronized (ClassA.class) {
 if (instance == null) {
  instance = new ClassA();
 }
 }
 }
 return instance;
 }
 
 public void test() {
 System.err.println(1);
 }
}
//靜態(tài)內(nèi)部類實現(xiàn)單例模式 兼容舊版jdk
public class ClassA {
 private ClassA() {
 
 }
 
 private static class InstanceClass {
 private static ClassA instance = new ClassA();
 }
 
 public static ClassA getInstance() {
 return InstanceClass.instance;
 }最新2020整理收集的很多干貨,包含mysql,netty,spring,線程,spring cloud、jvm、源碼、算法等詳細講解,需要獲取這些內(nèi)容的朋友加Q君樣:756584822
 
 public void test() {
 System.err.println(1);
 }
}
ClassA.getInstance().test(); //使用方法

7. 一些注意事項:

1. 靜態(tài)的成員變量可以被實例化后的類對象訪問,靜態(tài)方法也可以被對象訪問,但是會有警告。

2. 局部變量不可以static。

3. static代碼塊優(yōu)先于構(gòu)造函數(shù)。

上述就是小編為大家分享的static關(guān)鍵詞在java中的作用有哪些了,如果剛好有類似的疑惑,不妨參照上述分析進行理解。如果想知道更多相關(guān)知識,歡迎關(guān)注億速云行業(yè)資訊頻道。

向AI問一下細節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI