Ⅰ 高級java開發中什麼是靜態初始化器
靜態初始化器是由關鍵字static引導的一對大括弧括起的語句組。它的作用與類的構造函數有些相似,都用來完成初始化的工作,但是靜態初始化器與構造函數有三點根本的不同:
(1)構造函數是對每個新創建的對象初始化,而靜態初始化器是對每個類進行初始化;
(2)構造函數是在用new運算符產生新對象時由系統自動執行,而靜態初始化器則是在它所屬的類載入入內存時由系統調用運行的;
(3)不同於構造函數,靜態初始化器不是方法,沒有方法名、返回值和參數列表。
package com.text.java;
/**
* <p class="detail">
* 功能:靜態初始化器
* static{ 和 }之間的代碼被稱為靜態初始化器。它只有在第一次載入類時運行。
* 只有靜態變數才可以在靜態初始化器中進行訪問。
* 雖然創建了多個實例,但靜態初始化器只運行一次。
* </p>
* @ClassName: StaticUtil
* @version V1.0
* @date 2016-8-10
* @author dmw
*/
public class StaticUtil {
static int count;
static{
System.out.println("類初始化靜態載入++++");
System.out.println("載入次數"+count);
count++;
}
public static void main(String[] args) {
StaticUtil temp1=new StaticUtil();
StaticUtil temp2=new StaticUtil();
StaticUtil temp3=new StaticUtil();
// 輸出: 類初始化靜態載入++++
// 載入次數0
}
}
Ⅱ JAVA里初始化是什麼意思
初始化就是給變數一個初始值。
例如:
聲明一個變數:String aa = "abc";int cc =0;其中abc和0就是初始化的值,最後值不一定是abc或者 0加入你覆蓋了aa的值如下:
aa = "def" ; cc=1;那最後aa變數的值就是def,cc變數就是1了,初始化的目的是為了讓變數有值,防止使用時出現異常。
作用
1、遇到new,getstatic,putstatic,或invokestatic這4條位元組碼指令時,如果類沒有進行過初始化,則需要先觸發其初始化。生成這四條指令單最常見的Java代碼場景是:
使用new關鍵字實例化對象的時候,讀取或設置一個類的靜態欄位(被final修飾,已在變異期把結果放入常量池的靜態欄位除外)的時候,以及調用一個類的靜態方法的時候。
2、使用java.lang.reflect包的方法對類進行反射調用的時候,如果類沒有進行過初始化,則需要先出法其初始化。
3、當初始化一個類的時候,如果發現其父類還沒有進行初始化,則需要先出法其父類的初始化。
4、當虛擬機啟動時,用戶需要指定一個要執行的主類(包含main()方法的那個類),虛擬機會先初始化這個主類。
Ⅲ java類中的靜態常量是什麼時候初始化的
我們知道一個類(class)要被使用必須經過裝載,連接,初始化這樣的過程。下面先對這三階段做一個簡單的描述,之後會結合一個簡單的例子來說明java中類的初始化過程。
在裝載階段,類裝載器(Bootstrap ClassLoader 或者用戶自定義的ClassLoader) 把編譯形成的class文件載入內存,創建類相關的Class對象,這個Class對象封裝了我們要使用的類的類型信息。
連接階段又可以分為三個子步驟:驗證、准備和解析。
驗證就是要確保java類型數據格式 的正確性,並適於JVM使用。
准備階段,JVM為靜態變數分配內存空間,並設置默認值,注意,這里是設置默認值,比如說int型的變數會被賦予默認值0 。在這個階段,JVM可能還會為一些數據結構分配內存,目的 是提高運行程序的性能,比如說方法表。
解析過程就是在類型的常量池中尋找類、介面、欄位和方法的符號引用,把這些符號引用替換成直接引用。這個階段可以被推遲到初始化之後,當程序運行的過程中真正使用某個符號引用的時候 再去解析它。
類會在首次被「主動使用」時執行初始化,為類(靜態)變數賦予正確的初始值。在Java代碼中,一個正確的初始值是通過類變數初始化語句或者靜態初始化塊給出的。而我們這里所說的主動使用 包括:
1. 創建類的實例
2. 調用類的靜態方法
3. 使用類的非常量靜態欄位
4. 調用Java API中的某些反射方法
5. 初始化某個類的子類
6. 含有main()方法的類啟動時
初始化一個類包括兩個步驟:
1、 如果類存在直接父類的話,且直接父類還沒有被初始化,則先初始化其直接父類
2、 如果類存在一個初始化方法,就執行此方法
Ⅳ java 靜態變數初始化為什麼要用靜態初始化
在java中用final修飾符修飾的變數表示不可以被二次賦值,且系統不會給其賦默認值。 如果單純只是final變數,可以在定義的時候就賦默認值,也可以在構造方法中賦默認值。 但是如果同時用final static 修飾變數,因為static變數屬於類而不屬於對象,且在調用構造方法之前static 變數就已經被系統給賦默認值。而相應的final static 變數就只能在定義的時候就初始化,否則既無法在構造方法中初始化,系統又不會賦默認值,相當於這個變數被定義出來是毫無用處的。 因此java中final static變數必須初始化
Ⅳ 一個關於java靜態成員變數初始化的問題,目前有兩個類,分別是A和B。
A.a,A.b,A.c的時候就已經初始化了,即使你沒有new A,而當你B類中使用完畢之後,再new A對象,數值肯定還存在,因為靜態變數是全局的,而且只有一份,所以對象共用,所以不需要重新初始化了,靜態變數的改變是程序運行的時間內是永久生效的。
Ⅵ java類中的靜態變數是什麼時候初始化的
靜態方法是你手動調用的時候執行。
靜態變數與類一起載入,最優先的。
然後是,靜態初始化器(只初始化靜態成員變數)。
然後是,屬性初始化(只初始化非靜態成員變數)。
最後是,構造函數(常用的,你懂的)...
記住:先是靜態,然後是非靜態。
Ⅶ java 靜態數據初始化
從主類public class StaticInitialization 中的開始main函數開始。
在初始化對象時,開始 靜態數據的初始化
譬如:
執行完
public class StaticInitialization {
public static void main(String[] args) {
System.out.println(
"Creating new Cupboard() in main");
後,然後
執行new Cupboard();這段代碼
這時,程序就會跳到Cupboard這個類中,當實例化Cupboard這個類的對象的時候,Cupboard這個類的裡面靜態數據也同時被處理。
剩下的代碼都一樣。
Ⅷ Java靜態變數初始化問題
代碼沒貼全吧?static init B對應的代碼沒有,main方法也沒有貼
僅針對「請問為什麼a已經是11了,到了構造函數中卻又變成了10?」,答復如下:
在原有代碼基礎上增加main方法,代碼、執行輸出、及說明如下:
package testjdbc.;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.;
import testjdbc.domain.Stock;
class A
{
public static int a=10;
public static A A1=new A(a);
public int b=20;
public int c;
static
{
System.out.println("static init in A");
}
A()
{
System.out.println("init A no parament");
show();
}
A(int aa)
{
System.out.println("構造函數 A1:aa="+aa+",A1:b="+b+",A1:c="+c+",A1:d="+d+",a="+a);//關鍵在這里,原來的代碼裡面的a其實是輸入參數aa的值。關鍵點:(1)基本類型傳遞的是值,也即是說,調用static A A1=new A(a)時,將a當時的值傳遞給了臨時變數aa;(2)作用域,當此構造函數入參命名為a時,方法裡面的a實際上是引用的「作用域更小」的入參變數a,而不是類靜態變數a
c=d+aa+b;
System.out.println("init A with parament int");
}
{
a++;
System.out.println("static ... A1:a="+a+"A1:b="+b+"A1:c="+c+"A1:d="+d);
b+=a;
}
public static int d=30;
static
{
System.out.println("static init in A, a="+a+",d="+d);
}
public void show()
{
System.out.println("A:a="+a+"A:b="+b+"A:c="+c+"A:d="+d);
System.out.println("A1:a="+A1.a+"A1:b="+A1.b+"A1:c="+A1.c+"A1:d="+A1.d);
}
public static void main(String[] args) {
System.out.println("main init");
}
}
執行輸出:
static ... A1:a=11A1:b=20A1:c=0A1:d=0
構造函數 A1:aa=10,A1:b=31,A1:c=0,A1:d=0,a=11
init A with parament int
static init in A
static init in A, a=11,d=30
main init
Ⅸ java中靜態成員什麼時候被初始化,是啟動tomcat時還是調用該類時。
調用前就初始化了,因為靜態成員是作為一個類變數存在,在這個類被載入到虛擬機裡面時(或者tomcat運行容器)就已經被初始化了