㈠ java 中靜態內部類欄位什麼時候初始化是在外部類載入的時候就初始化嗎
首先分析下名字:靜態內部類
靜態是static。靜態的方法或者參數是隨著類的載入而產生的(感覺應該是JVM啟動時static屬性就載入了。)。這就是為什麼不用實例化類,就可以調用它的原因。
內部類:用內部類是因為內部類與所在外部類有一定的關系,往往只有該外部類調用此內部類。其他類不會調用。所以沒必要另寫一個類。外部類可以調用內部類。而內部類不能調用外部類的方法。
所以我覺得
靜態內部類中的屬性,方法,是在外部類載入的時候初始化的。
希望對您有幫助。如果有問題請自行
谷歌
度娘.
㈡ 關於JAVA中static初始化問題
java虛擬機在首次主動使用類型的時候才會初始化(lazy-load的形式),主動使用包括以下6種情況
1. 創建類的實例
2. 調用類的靜態方法
3. 操作類的非常量靜態欄位(非final static)
4. 調用特定的反射方法
5. 初始化一個類的子類
6. 指定一個類為虛擬機啟動時的初始化類
所以說,你必須主動使用到這個類,這個類才會被初始化,這就能解釋第一次有輸出,而第二次沒有輸出的情況了
另外,值得一提的是,載入和初始化不是一個概念,比如,在main函數中寫
Table a = null;
一樣不會有輸出。。Table類被載入了但是沒有被初始化,因為這不屬於上述6種「主動使用」情況之一,不信試試。。。
㈢ 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 初始化順序語法並不正確
執行到Test1.a
調用了Test1所以開始對Test1中靜態部分初始化
初始化a static int a=(new Test1()).aa();
因為new了Test1對象 所以線程執行實例化類Test1,實例代碼塊執行
之後調用int aa() , aa()執行
到這里 a的初始化完畢
又開始執行 靜態代碼塊"
最後輸出結果
你調用一個類 靜態方法塊或屬性沒有初始化的話 就進行初始化
實例化一個類 就調用構造方法實例化 並沒有什麼語法相悖啊
若static int a=(new Test1()).aa();改為static int a=10;則該程序實例初始化根本就不會執行
你有沒有實例化對象 又怎麼會執行"實例初始化"
㈤ java static 類 什麼時候初始化
java">代碼:Student s = new Student();做了哪些事情?(理解)
(1)把Student.class文件載入到內存
(2)在棧內存為s開辟空間
(3)在堆內存為學生對象申請空間
(4)給學生的成員變數進行默認初始化。null,0
(5)給學生的成員變數進行顯示初始化。林青霞,27
(6)通過構造方法給成員變數進行初始化。劉意,30
(7)對象構造完畢,把地址賦值給s變數
㈥ 高級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的靜態塊和初始化塊分別何時執行有什麼區別
靜態初始化塊:當類第一次載入時執行。
非靜態初始化塊:非靜態初始化塊會在構造函數執行時,且在構造函數主體代碼執行之前被執行。
區別如下:
1、執行次數不同
靜態塊只執行一次,初始化塊可以執行多次。
2、作用不同
靜態初始化塊僅能初始化類變數,即static修飾的數據成員。
非靜態初始化塊可以初始化類的實例變數。
(7)javastatic初始化擴展閱讀:
使用Java靜態代碼塊注意事項:
1、它是隨著類的載入而執行,只執行一次,並優先於主函數。具體說,靜態代碼塊是由類調用的。類調用時,先執行靜態代碼塊,然後才執行主函數的。
2、靜態代碼塊其實就是給類初始化的,而構造代碼塊是給對象初始化的。
3、靜態代碼塊中的變數是局部變數,與普通函數中的局部變數性質沒有區別。
4、一個類中可以有多個靜態代碼塊。
5、對於靜態變數、靜態初始化塊、變數、初始化塊、構造器,它們的初始化順序依次是(靜態變數、靜態初始化塊)>(變數、初始化塊)>構造器。
㈧ java中的靜態初始化和動態初始化
靜態初始化就是static,動態初始化就是new
所謂的靜態和動態是相對於程序運行是而言的,靜態是在程序編譯時就初始化好了的,動態初始化是在程序運行是才動態分配內存空間,
我覺得已經夠通俗的了
㈨ 關於Java顯示的靜態初始化
static{ cup1=new Cup(1);cup2=new Cup(2);} 這個就是java里的靜態成員初始化語法。不是方法,只是給靜態成員數據賦初始值。
Cup.cup1.f(99)可以看成兩部分:
x = Cup.cup1 這是取出Cup類中的靜態成員數據cup1,這里稱之x
x.f(99) 這是調用對象x的成員函數f
㈩ Java 中final static變數為什麼要初始化
舉個例子:一、一個屬性成員變數為:public int age;(編寫完該句意味著虛擬機已經為該成員變數age賦默認值0。int類型默認值為0。也可以直接定義時賦值,如public int age =10;。該age的值可以被賦值或者在構造方法裡面進行改變)。
二、public static int age;(該句增加static修飾age,不同的是,加了static表示了該變數為全局變數,且默認取值為0,因為int默認取值為0。也可以進行直接定義時賦值public static int age =10;不同的是該屬性不依賴對象、依賴類,本類對象共享一份,和上面一樣該age的值一樣可以被賦值或者在構造方法裡面進行改變)。
三、public final int age;(該句用final單獨修飾,表示該成員屬性變數age將不會取int類型的默認值,故age沒有被初始化,必須在定義的時候進行直接賦值,或者在創建對象的時候使用構造方法對該成員屬性變數進行賦值。並且一旦用final定義後,就變為最終變數,值 不可以再被改變!所以,該句代碼的正確寫法應該是如下兩種:1、public final int age = 10;
2、
class Dog{
public final int age;
public Dog(){
int age = 10;
}
}
)。
四、public static final int age;(該句和上面一樣,也是age沒有被初始化,所以age必須被賦值,不同的是該情況下必須是直接賦值,而不能在構造方法裡面進行賦值。正確的寫法是:public static final int age = 10;這是因為第一、用final修飾的屬性不能夠用數據類型的默認值為初始化的值,必須要直接賦值,或者在使用構造方法去創建對象的時候對變數進行賦值。但是,第二、由於被static修飾以後的屬性成員變數,該成員變數是在類載入完的時候其值已經被確定了,該值依賴類,並不依賴對象。即使不創建對象它就已經有值了,並且由於被final所修飾不能夠用數據類型的默認值,故而只能直接賦值,並且被final所修飾成為了最終變數,不可以改變。故而,由於以上兩方面原因,只能是直接賦值。public static final int age = 10;)