研究內(nèi)存的初始化時(shí)機(jī),有助于設(shè)計(jì)“降低應(yīng)用內(nèi)存消耗”方案! public class A { private Object mObject = new Object();// or static private st..."/>
您好,登錄后才能下訂單哦!
>研究內(nèi)存的初始化時(shí)機(jī),有助于設(shè)計(jì)“降低應(yīng)用內(nèi)存消耗”方案!
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 + "秒延時(shí)結(jié)束");
}
public A(String clzName) {
// TODO Auto-generated constructor stub
mClzName = clzName;
}
public void print() {
System.out.println(mClzName + "\t" + mObject.toString());
}
}
先看定義的實(shí)例類A,使用“靜態(tài)塊”、“構(gòu)造器”、“print方法”來監(jiān)控“類何時(shí)初始化”!
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();
}
}
}
用這個(gè)類,來驗(yàn)證類A的初始化內(nèi)容
結(jié)果1:
null static塊 2000秒延時(shí)結(jié)束
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
說明兩個(gè)問題
第一、“static塊”先于“構(gòu)造器”執(zhí)行(延時(shí)任務(wù)就是用來驗(yàn)證這個(gè)結(jié)論的);
第二、非靜態(tài)的Object,每次都被new了一個(gè)。
把Ojbect改成static的
結(jié)果2:
null static塊 2000秒延時(shí)結(jié)束
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
結(jié)果1與結(jié)果2,對比說明:靜態(tài)變量只會被初始化一次。
------------------------------------------------------------------------------------------------------------------------
類何時(shí)初始化呢?
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();
}無錫×××醫(yī)院 https://yyk.familydoctor.com.cn/20612/
public static void main(String[] args) {
testClassLoad();
testClassInitialize();
}
}
只執(zhí)行testClassLoad方法,
結(jié)果1:
---------testClassLoad--------------
Initalize A is false A
Initalize A is true A
com.java.thinking.dalvik.StaticA
說明:不論加載類A,還是調(diào)用A的類方法,都不會執(zhí)行初始化操作。
只執(zhí)行testClassInitliaze方法,
結(jié)果2:
------------testClassInitialize----------
null static塊 2000毫秒延時(shí)結(jié)束
null java.lang.Object@7852e922
說明:類的“方法”被調(diào)用時(shí),類才真正初始化。同理可證,類的“變量”被調(diào)用時(shí),類才真正初始化。
PS:被調(diào)用,無論是直接new對象、定義靜態(tài)方法/變量,還是通過反射等操作,都可以。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。