java靜態載入
⑴ java中的 static{ …… } 是什麼意思
是靜態修飾符,什麼叫靜態修飾符呢?大家都知道,在程序中任何變數或者代碼都是在編譯時由系統自動分配內存來存儲的,而所謂靜態就是指在編譯後所分配的內存會一直存在,直到程序退出內存才會釋放這個空間,也就是只要程序在運行,那麼這塊內存就會一直存在。這樣做有什麼意義呢?
在Java程序裡面,所有的東西都是對象,而對象的抽象就是類,對於一個類而言,如果要使用他的成員,那麼普通情況下必須先實例化對象後,通過對象的引用才能夠訪問這些成員,但是有種情況例外,就是該成員是用static聲明的(在這里所講排除了類的訪問控制),例如:
未聲明為static
class ClassA{
int b;
public void ex1(){
…
}
}
class ClassB{
void ex2{
int i;
ClassA a = new ClassA();
i = a.b; //這里通過對象引用訪問成員變數b
a.ex1; //這里通過對象引用訪問成員函數ex1
}
}
聲明為static
class ClassA{
static int b;
static void ex1(){
…
}
}
class ClassB{
void ex2{
int i;
i = ClassA.b; //這里通過類名訪問成員變數b
ClassA.ex1; //這里通過類名訪問成員函數ex1
}
}
通過以上兩種比較,就可以知道static用來修飾類成員的主要作用了,在java類庫當中有很多類成員都聲明為static,可以讓用戶不需要實例化對象就可以引用成員,最基本的有Integer.parseInt(),Float.parseFloat()等等用來把對象轉換為所需要的基本數據類型。這樣的變數和方法我們又叫做類變數和類方法。
接下來講一下被static修飾後的變數的值的問題,剛才在前面講過,被static修飾後的成員,在編譯時由內存分配一塊內存空間,直到程序停止運行才會釋放,那麼就是說該類的所有對象都會共享這塊內存空間,看一下下面這個例子:
class TStatic{
static int i;
public TStatic(){
i = 4;
}
public TStatic(int j){
i = j;
}
public static void main(String args[]){
TStatic t = new TStatic(5); //聲明對象引用,並實例化
TStatic tt = new TStatic(); //同上
System.out.println(t.i);
System.out.println(tt.i);
System.out.println(t.i);
}
}
這段代碼裡面Tstatic類有一個static的int變數I,有兩個構造函數,第一個用於初始化I為4,第二個用於初始化i為傳進函數的值,在main中所傳的值是5,程序首先聲明對象的引用t,然後調用帶參數的構造函數實例化對象,此時對象t的成員變數I的值為5,接著聲明對象tt,調用無參數的構造函數,那麼就把對象tt的成員變數i的值初始化為4了,注意了,在這里i是static,那就是說該類的所有對象都共享該內存,那也就是說在實例化對象tt的時候改變了i的值,那麼實際上對象t的i值也變了,因為實際上他們引用的是同一個成員變數。最後列印的結果是三個4。呵呵,寫到這里大家是否明白了呢?不明白就再看看書或者多寫幾個例子印證一下,呵呵。
⑵ 在Java中載入配置文件,使用靜態載入和構造方法載入有什麼區別
構造方法是只有你在new對象的時候才會執行
靜態語句塊和靜態方法在類載入到內存的時候就已經執行了
靜態載入配置文件,在你啟動類似tomcat服務的時候就已經執行了
⑶ java靜態代碼塊 類載入順序問題。
原因就是一句話:先有了父親,才會有兒子!
程序運行時,載入AB兩類,因為A是B子類,所以先載入B類,Load B,再加在A類 LoadA,調用A a = new A()代碼時,會先調用其父類B的構造方法 Create B 再調用A的構造方法 Create A
⑷ java中的靜態成員是否是在類載入的時候就被載入到內存中了
對,首先可以肯定的是你的說法是正確的。
類載入的過程有以下幾個過程:載入、驗證、准備、解析
在准備的過程中,靜態成員變數就會進行內存分配,而不包括實例變數,實例變數是在對象實例化隨著對象一起分配在java堆中的。但是要注意一點,比如:public static int a=1;那變數在准備階段過後的初始值是0而不是1.因為這個時候尚未執行任何的Java方法。而是賦值了一個初始值,如果是引用成員變數就會為null,其他基本類型對應的是其基本默認值。
ps:以上資料來自《深入Jvm虛擬機》
⑸ 怎麼理解java中的靜態載入類和動態載入類
一.什麼是動態載入類 什麼是靜態載入類
Class.forName 不僅表示類的類類型,還代表了動態載入類。編譯時載入是靜態載入類,
運行時載入是動態載入類。
二.為何要使用動態載入類
我們寫了一個程序 並沒有寫A類和B類以及start方法?
⑹ java怎麼讓一個靜態方法在啟動的時候載入
java 在啟動時候本來就是 會載入那些靜態的變數啦。方法啦。。。要不你main方法根本就執行不到。因為main是靜態方法哦
⑺ java靜態資源(靜態方法,靜態屬性)是程序一運行就載入到jvm中,還是當被調用的時候才進行載入呢
java靜態資源(靜態方法,靜態屬性)是程序一運行就載入到jvm中的。
1、類中的靜態屬性會被加入到類對象(也可以叫做類的模板,是類的描述) 的構造器中,靜態方法也會被加入到類對象中。
2、當第一次使用類時,JVM會通過類載入器,載入類對象,從而初始化靜態屬性,並裝入類的方法,包括靜態方法和實例方法(方法不會被調用,只是載入,從這個意義上來說,靜態方法和實例方法是類似的)。嫌乎殲
3、當頃孝創建類的實例對象時,JVM會調用類的構造器,從而初始化類的屬性。
(7)java靜態載入擴展閱讀:
JVM 類載入機制
JVM類載入機制分為五個部分:載入,驗證,准備,解析,初始化,下面我們就分別來看一下這五個過程。
1、載入
載入是類載入過程中的一個階段,這個階段會在內存中生成一個代表這個類的java.lang.Class對象,作為方法區這個類的各種數據的入口。注意這里不一定非得要從一個Class文件獲取,這里既可以從ZIP包中讀取(比如從jar包和war包中讀取),也可以在運行時計算生成(動態代理),也可以由其它文件生成(比如將JSP文件轉換成對應的Class類)。
2、驗證
這一階段的主要目的是為了確保Class文件的位元組流中包含的信息是否符合當前虛擬機的要求,並且不會危害虛擬機自身的安全。
3、准備
准備階段是正式為類變數分配內存並設置類變數的初始值階段,即在方法區中分配這些變數芹沖所使用的內存空間。
4、解析
解析階段是指虛擬機將常量池中的符號引用替換為直接引用的過程。符號引用就是class文件中的:
CONSTANT_Class_info
CONSTANT_Field_info
CONSTANT_Method_info
等類型的常量。
5、初始化
初始化階段是類載入最後一個階段,前面的類載入階段之後,除了在載入階段可以自定義類載入器以外,其它操作都由JVM主導。到了初始階段,才開始真正執行類中定義的Java程序代碼。初始化階段是執行類構造器<client>方法的過程。