1. 程式人生 > 程式設計 >一文帶你快速瞭解java中的static關鍵詞

一文帶你快速瞭解java中的static關鍵詞

Static基本規則:

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

(2)一個類的靜態方法不能直接呼叫非靜態方法。

(3)如果訪問許可權允許,static屬性和方法可以使用物件加'.'方式呼叫,當然也可以使用例項加'.'方式呼叫。

(4)靜態方法中不存在當前物件,所以不能使用this,當然也不能使用super。

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

(6)構造方法不允許被宣告為static的。

static關鍵詞,可以加在方法上,成員變數上,程式碼塊。 類就不要想了。

1. static方法

static方法可以在類沒有例項化的情況話直接訪問。 在靜態方法中不能訪問類的非靜態成員變數和非靜態成員方法,因為非靜態成員方法/變數都是必須依賴具體的物件才能夠被呼叫。

2. static變數

static變數也稱作靜態變數,靜態變數和非靜態變數的區別是:靜態變數被所有的物件所共享,在記憶體中只有一個副本,它當且僅當在類初次載入時會被初始化。而非靜態變數是物件所擁有的,在建立物件的時候被初始化,存在多個副本,各個物件擁有的副本互不影響。

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

static變數只會有一個記憶體空間,雖然後多個例項,但這些例項中的static變數會共享同一個記憶體空間。所以靜態變數的值發生變更要格外注意,以免造成不必要的“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());

結果:

11:1
22:2
2

4. static內部類

為何要用內部類?

1). 內部類一般只為其外部類使用;

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

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

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

5. static靜態匯入

靜態導包是為了簡化程式碼,提高程式碼的閱讀性,但是如果濫用閱讀性會很糟糕。

對於靜態匯入,一定要遵循兩個規則(來自下面的資料):

不使用*(星號)萬用字元,除非是匯入靜態常量類(只包含常量的類或介面)。
方法名是具有明確、清晰表象意義的工具類。

import static java.lang.System.*;

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

6. 實現單例

public class ClassA {
 
 private static ClassA instance = null;
 
 public static synchronized ClassA getInstance() {//靜態方法生成例項 懶漢模式 用到的時候再例項化
 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關鍵詞,單例模式最優解決方案,不支援舊版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);
 }
}
//靜態內部類實現單例模式 相容舊版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、原始碼、演算法等詳細講解,需要獲取這些內容的朋友加Q君樣:756584822
 
 public void test() {
 System.err.println(1);
 }
}
ClassA.getInstance().test(); //使用方法

7. 一些注意事項:

1. 靜態的成員變數可以被例項化後的類物件訪問,靜態方法也可以被物件訪問,但是會有警告。

2. 區域性變數不可以static。

3. static程式碼塊優先於建構函式。

到此這篇關於java中static關鍵詞的文章就介紹到這了,更多相關java中static關鍵詞內容請搜尋我們以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援我們!