-
static關(guān)鍵字
作用:- 方便在沒有創(chuàng)建對象的時候調(diào)用方法或者對象
- 被static變量修飾的變量,代碼塊,方法只會在類初始化的時候加載一次
- 被static變量修飾的變量,代碼塊,方法在內(nèi)存(運(yùn)行時常量池中)中只會生成一個副本
- 使用 static final 進(jìn)行 常量傳播優(yōu)化,在使用 static final 修飾的變量時不會進(jìn)行類的初始化
public class ConstClass{
static {
System.out.println("ConstClass init!");
}
public static final String HELLOWORLD = "hello world";
}
public class NotInitialization{
public static void main(String[] args){
System.out.println(ConstClass.HELLOWORLD);
}
}
- static代碼塊
- static變量
-
static方法
- static方法會隨著類的初始化而被裝載到內(nèi)存(運(yùn)行時常量池中類對應(yīng)的Class對象)中。所以static方法在內(nèi)存中有且僅有一個內(nèi)存空間。
- 因為static方法中只能存在靜態(tài)成員變量,所以任意一個對象對靜態(tài)成員變量的修改都會影響其他對象。
每一個被虛擬機(jī)加載類在運(yùn)行時常量池中都有且僅有一個對應(yīng)的Class對象
-
static類
靜態(tài)內(nèi)部類不依附與外部類(不能在靜態(tài)內(nèi)部類中使用 外部類.this)
靜態(tài)內(nèi)部類和普通內(nèi)部類區(qū)別
1. 表面區(qū)別:普通內(nèi)部類可以調(diào)用外部類的任意變量/方法,靜態(tài)內(nèi)部類只能調(diào)用靜態(tài)變量/方法
2. 本質(zhì)區(qū)別:普通內(nèi)部類會維護(hù)一個外部類的this變量(也就是和當(dāng)前內(nèi)部類對象相關(guān)聯(lián)的外部類實例),這也就是為什么實例化(new)普通內(nèi)部類先實例化(new)一個外部類的原因。
而靜態(tài)內(nèi)部類沒有維護(hù)該this變量,意味著靜態(tài)內(nèi)部類和外部類沒有強(qiáng)關(guān)聯(lián)關(guān)系(這也就意味著靜態(tài)內(nèi)部類和外部類相當(dāng)于是借雞下蛋的關(guān)系,看著屬于外部類,其實本質(zhì)上沒有任何關(guān)系,靜態(tài)內(nèi)部類相當(dāng)于普通類)。
這是最簡單的一個普通內(nèi)部類示例
public class OuterClass {
public class InnerClass{
}
}
使用javap -c進(jìn)行編譯

普通內(nèi)部類
public class OuterClass {
public static class InnerClass{
}
}

靜態(tài)內(nèi)部類

外部類
other
靜態(tài)內(nèi)部類可以實例化多個對象(內(nèi)存空間不一樣)