>研究內(nèi)存的初始化時機,有助于設計“降低應用內(nèi)存消耗”方案!
成都創(chuàng)新互聯(lián)公司是專業(yè)的堆龍德慶網(wǎng)站建設公司,堆龍德慶接單;提供成都網(wǎng)站建設、網(wǎng)站建設,網(wǎng)頁設計,網(wǎng)站設計,建網(wǎng)站,PHP網(wǎng)站建設等專業(yè)做網(wǎng)站服務;采用PHP框架,可快速的進行堆龍德慶網(wǎng)站開發(fā)網(wǎng)頁制作和功能擴展;專業(yè)做搜索引擎喜愛的網(wǎng)站,專業(yè)的做網(wǎng)站團隊,希望更多企業(yè)前來合作!
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 + "秒延時結(jié)束");
}
public A(String clzName) {
// TODO Auto-generated constructor stub
mClzName = clzName;
}
public void print() {
System.out.println(mClzName + "\t" + mObject.toString());
}
}
先看定義的實例類A,使用“靜態(tài)塊”、“構造器”、“print方法”來監(jiān)控“類何時初始化”!
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的初始化內(nèi)容
結(jié)果1:
null static塊 2000秒延時結(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
說明兩個問題
第一、“static塊”先于“構造器”執(zhí)行(延時任務就是用來驗證這個結(jié)論的);
第二、非靜態(tài)的Object,每次都被new了一個。
把Ojbect改成static的
結(jié)果2:
null static塊 2000秒延時結(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)變量只會被初始化一次。
------------------------------------------------------------------------------------------------------------------------
類何時初始化呢?
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毫秒延時結(jié)束
null java.lang.Object@7852e922
說明:類的“方法”被調(diào)用時,類才真正初始化。同理可證,類的“變量”被調(diào)用時,類才真正初始化。
PS:被調(diào)用,無論是直接new對象、定義靜態(tài)方法/變量,還是通過反射等操作,都可以。