91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

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

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

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

韶山市| 申扎县| 秦安县| 太仆寺旗| 北安市| 台南县| 阿图什市| 彭州市| 龙海市| 九龙城区| 都昌县| 焉耆| 上思县| 和静县| 松阳县| 五峰| 拜泉县| 宣汉县| 汉中市| 云林县| 徐水县| 霸州市| 盘山县| 赤城县| 蒲城县| 错那县| 日土县| 益阳市| 东至县| 阿勒泰市| 石河子市| 陆丰市| 鹿邑县| 股票| 仙桃市| 遵化市| 类乌齐县| 洛宁县| 融水| 洪泽县| 郴州市|