您好,登錄后才能下訂單哦!
>研究內存的初始化時機,有助于設計“降低應用內存消耗”方案!
public class A {
private Object mObject = new Object();// or static
private static long sStartInitlizeTime;
private static String mClzName;
private static final long sDelayTime = 2000;
static {
sStartInitlizeTime = System.currentTimeMillis();
while (System.currentTimeMillis() - sStartInitlizeTime > sDelayTime) {
break;
}
System.out.println(mClzName + " static塊 " + sDelayTime + "秒延時結束");
}
public A(String clzName) {
// TODO Auto-generated constructor stub
mClzName = clzName;
}
public void print() {
System.out.println(mClzName + "\t" + mObject.toString());
}
}
先看定義的實例類A,使用“靜態塊”、“構造器”、“print方法”來監控“類何時初始化”!
public class TestAInitialize {
public static void main(String[] args) {
for (int i = 0; i < 5; i++) {
String name = "A" + i;
new Thread(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
new A(name).print();
}
}).start();
}
}
}
用這個類,來驗證類A的初始化內容
結果1:
null static塊 2000秒延時結束
A3 java.lang.Object@6b19c877
A1 java.lang.Object@6695b54d
A4 java.lang.Object@1e6fa5a2
A2 java.lang.Object@8730a97
A0 java.lang.Object@44029c5d
說明兩個問題
第一、“static塊”先于“構造器”執行(延時任務就是用來驗證這個結論的);
第二、非靜態的Object,每次都被new了一個。
把Ojbect改成static的
結果2:
null static塊 2000秒延時結束
A2 java.lang.Object@6695b54d
A0 java.lang.Object@6695b54d
A3 java.lang.Object@6695b54d
A4 java.lang.Object@6695b54d
A1 java.lang.Object@6695b54d
結果1與結果2,對比說明:靜態變量只會被初始化一次。
------------------------------------------------------------------------------------------------------------------------
類何時初始化呢?
public class TestInitialize {
/**
* 類加載
*/
private static void testClassLoad() {
System.out.println("---------testClassLoad--------------");
try {
Class.forName("A", false, TestInitialize.class.getClassLoader());
} catch (ClassNotFoundException e) {
System.out.println("Initalize A is false " + e.getMessage());
}
try {
Class.forName("A", true, TestInitialize.class.getClassLoader());
} catch (ClassNotFoundException e) {
System.out.println("Initalize A is true " + e.getMessage());
}
Class clzA = StaticA.class;
System.out.println(clzA.getName());
}
/**
* 類初始化
*/
private static void testClassInitialize() {
System.out.println("------------testClassInitialize----------");
StaticA.print();
}無錫×××醫院 https://yyk.familydoctor.com.cn/20612/
public static void main(String[] args) {
testClassLoad();
testClassInitialize();
}
}
只執行testClassLoad方法,
結果1:
---------testClassLoad--------------
Initalize A is false A
Initalize A is true A
com.java.thinking.dalvik.StaticA
說明:不論加載類A,還是調用A的類方法,都不會執行初始化操作。
只執行testClassInitliaze方法,
結果2:
------------testClassInitialize----------
null static塊 2000毫秒延時結束
null java.lang.Object@7852e922
說明:類的“方法”被調用時,類才真正初始化。同理可證,類的“變量”被調用時,類才真正初始化。
PS:被調用,無論是直接new對象、定義靜態方法/變量,還是通過反射等操作,都可以。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。