亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Java高級之內存初始化時機

發布時間:2020-07-13 00:17:40 來源:網絡 閱讀:266 作者:nineteens 欄目:編程語言

  >研究內存的初始化時機,有助于設計“降低應用內存消耗”方案!

  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對象、定義靜態方法/變量,還是通過反射等操作,都可以。


向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

宁海县| 兖州市| 绥化市| 永兴县| 福贡县| 久治县| 蕉岭县| 乌拉特前旗| 应城市| 黔西| 南汇区| 晋宁县| 灵璧县| 聂荣县| 巴彦淖尔市| 金阳县| 安平县| 大庆市| 九江县| 宁明县| 黄平县| 黄陵县| 广河县| 赞皇县| 行唐县| 新竹市| 和静县| 临江市| 满城县| 扶风县| 英山县| 南漳县| 邯郸市| 剑河县| 宁河县| 陈巴尔虎旗| 汽车| 贞丰县| 尤溪县| 土默特左旗| 碌曲县|