温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

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