static 關鍵字

static

static修飾的變量和方法統(tǒng)一屬于類的靜態(tài)資源,是類實例之間共享的
JDK將不同的靜態(tài)資源放在不同的類中,而不是把所有靜態(tài)資源放在一個類中,可以實現靜態(tài)分類(不同類有自己的靜態(tài)資源),避免重名和靜態(tài)資源無限膨脹.

靜態(tài)變量和靜態(tài)方法

  1. 被static修飾的變量屬于類變量,可以通過類名.變量名直接引用,不需要new
  2. 被static修飾的方法屬于類方法,可以通過類名.方法名直接引用,不需要new

靜態(tài)資源屬于類,但是獨立于類存在,靜態(tài)資源是類初始化的時候加載的,而非靜態(tài)資源那是類new的時候加載的。
類的初始化早于類的new,比如Class.forName("xxx")方法,就是初始化一個類,但是并沒有new,只是加載這個類的靜態(tài)資源,所以:

  • 靜態(tài)方法不能引用非靜態(tài)資源
  • 靜態(tài)方法可以引用靜態(tài)資源
  • 非靜態(tài)方法可以引用靜態(tài)資源

錯誤示例

public class A
{
    private int i = 1;
    
    public static void main(String[] args)
    {
        // 錯誤代碼,靜態(tài)方法不能有引用非靜態(tài)資源
        i = 1;
    }
}

靜態(tài)塊

靜態(tài)塊用于初始化一個類的時候操作用的,和靜態(tài)變量、靜態(tài)方法一樣,靜態(tài)塊里面的代碼只執(zhí)行一次,且只在初始化類的時候執(zhí)行。

  • 靜態(tài)資源的加載順序是嚴格按照靜態(tài)資源的定義順序來加載的
public class A {
    private static int a = B();

    static {
        System.out.println("A.static block");
    }

    public static void main(String[] args) {
        System.out.println("a = " + a);
    }

    public static int B() {
        System.out.println("A.B()");
        return 1;
    }
}

打印結果:

    A.B()
    A.static block
    a = 1
  • 靜態(tài)代碼塊對于定義在它之后的靜態(tài)變量可以賦值,不可以訪問
public class A {
    static {
        c = 3;
        System.out.println(c);           // Cannot reference a field before it is defined 無法在定義字段之前引用該字段
    }

    private static int c;
}
  • 靜態(tài)代碼塊是嚴格按照 父類靜態(tài)代碼塊>>子類靜態(tài)代碼塊 的順序加載的,且只加載一次
public class A {
    static {
        System.out.println("A.static block");
    }

    public A() {
        System.out.println("A.constructor()");
    }
}

class B extends A {
    static {
        System.out.println("B.static block");
    }

    public B() {
        System.out.println("B.constructor()");
    }

    public static void main(String[] args) {
        new B();
        new B();
    }
}

打印結果:

A.static block
B.static block
A.constructor()
B.constructor()
A.constructor()
B.constructor()

兩個具有繼承關系類的初始化順序
父類的(靜態(tài)變量、靜態(tài)代碼塊)>> 子類的(靜態(tài)變量、靜態(tài)代碼塊)>> 父類的(變量、初始化塊、構造器)>> 子類的(變量、初始化塊、構造器)

static修飾類

使用static修飾類時,說明這個類時靜態(tài)內部類,也就是匿名內部類。

public class A {
    static class C {
        static {
            System.out.println("C.static block");
        }

        public C() {
            System.out.println("C.constructor()");
        }
    }

    static {
        System.out.println("A.static block");
    }

    public A() {
        System.out.println("A.constructor()");
    }

    public static void main(String[] args) {
        new A();
        new C();
    }
}

打印結果 :

A.static block
A.constructor()
C.static block
C.constructor()

import static

指定導入某個類中的指定靜態(tài)資源,不需要類名.資源名,可以直接使用資源名。
注意一下,import static必須這么寫,而不能寫成static import。

import static java.lang.Math.sin;
import static java.lang.Math.sqrt;
//import static java.lang.Math.*;  導入Math中所有靜態(tài)資源

public class AA {
    public static void main(String[] args) {
        System.out.println(Math.abs(-2.6));
        // 輸出 : 2.6
        System.out.println(sin(2));
        // 輸出 : 0.9092974268256817
        System.out.println(sqrt(4));
        // 輸出 : 2.0
    }
}
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

  • static關鍵字的用途 方便在沒有創(chuàng)建對象的情況下來進行調用(方法/變量)。被static關鍵字修飾的方法或者變...
    dlihasa閱讀 421評論 0 4
  • static 關鍵字 static 關鍵字主要有以下四種使用場景 修飾成員變量和成員方法 靜態(tài)代碼塊 修飾類(只能...
    青青子衿zq閱讀 171評論 0 0
  • 前言 之前講到final關鍵字的作用是每次面試的時候我必問求職者的兩個問題之一,另外一個問題就是文本會寫到的sta...
    叨唧唧的閱讀 488評論 0 0
  • 文章大綱:1.為什么static會有這樣的效果?2.static的使用3.static誤區(qū)4.static面試題 ...
    檸檬烏冬面閱讀 5,987評論 3 43
  • 一.static關鍵字的用途 在《Java編程思想》P86頁有這樣一段話: “static方法就是沒有this的方...
    ThreeGold閱讀 606評論 1 2

友情鏈接更多精彩內容