通常在進行分析的時候,會從三個方面進行分析:類、方法(構造方法、成員方法)、變量(成員變量(靜態變量、實例變量)、局部變量)。java
被static修飾的變量和方法,被類的全部實例所共享
。加載類時只分配一次內存。dom
不能使用this關鍵字
且不能訪問實例變量
,由於被全部實例所共有,沒法判斷屬於哪一個實例對象有final修飾表示最終(不可再修改)
的意思:函數
靜態常量
屬於編譯時常量
(final static int a=2*3;在編譯的時就能計算出具體的值),在編譯的時候將這個值就放入到常量池中,a被訪問時類是不會被初始化的(這是類的被動使用
)。訪問類的靜態變量或靜態方法的時候類會被初始化(這是類的主動使用
)。而靜態變量
只會在類初始化的時候纔會被賦值)。具體細節請參考「類的生命週期」
---加載(堆區、方法區)--鏈接(驗證、準備(靜態變量分配內存、設置默認初始值爲0)、解析(符號引用替換爲直接引用,即指針指向方法區的內存位置))--初始化(程序對類或接口主動使用
的時候纔會被初始化。類的初始化
即java虛擬機爲類的static靜態變量
賦予初始值(這和準備階段設置默認初始值爲0是不同的)。只有類的主動使用纔會初始化類
。this
調用類的靜態變量或對靜態變量賦值:指針
public class Person{ static int a=2*3; //這和final static int a=2*3;是有區別的 static{ //Java在定義一個類的時候裏面只能放方法和屬性,這是規定死了的。System.out.println()是在調用一個叫println的函數,這裏是函數的調用而不是類裏面定義一個函數。因此須要用static代碼塊 System.out.println("init Person"); //static聲明的靜態代碼塊,使得類在初始化的時候會被調用而不須要建立實例對象。它這時候就不在任何一個方法中。 } }
調用的時候寫:code
System.out.println("a="+Person.a); //這樣就能夠在不new一個Person實例的狀況下,來初始化Person類了。
final類型的靜態變量在編譯的時候能計算出值(即編譯時常量
,在編譯的時候將這個值就放入到常量池中了):
注: final類型的靜態變量在編譯的時候不能計算出變量的值(即運行時常量
)的時候是會被初始化的對象
final static int a=2*3; //變量a是編譯時常量 final static int a=(int)Math.random(); //變量a不是是編譯時常量(即運行時常量)