JAVA初始化容易忽略的陷阱

原创|其它|编辑:郝浩|2010-01-05 10:15:36.000|阅读 391 次

概述:静态变量初始化的问题,静态变量初始化是在类加载期间就已经进行了初始化,也就是说当在没有进行类初始化(注:类加载在类初始化之前)的时候staticStr = "static1"已经被保存在内存中了……

# 界面/图表报表/文档/IDE等千款热门软控件火热销售中 >>

  为了说明这个问题先给大家出个问题吧:

  请看代码:

     view plaincopy to clipboardprint?
  public abstract class A {
  public A() {
  initMethod();
  }
  public abstract void initMethod();
  }
  public abstract class A {
  public A() {
  initMethod();
  }
  public abstract void initMethod();
  }
  view plaincopy to clipboardprint?
  public class B extends A {
  static String staticStr = "static1";
  private String testStr = "Test1";
  /*
  * (non-Javadoc)
  *
  * @see A#initMethod()
  */
  public void initMethod() {
  // TODO Auto-generated method stub
  testStr = "Test2";
  staticStr = "static2";
  }
  /**
  * @return the testStr
  */
  public String getTestStr() {
  return testStr;
  }
  /**
  * @param testStr
  * the testStr to set
  */
  public void setTestStr(String testStr) {
  this.testStr = testStr;
  }
  /**
  * create data: 2009-12-29

  *
  * @author XiangJie
  * @param args
  *
  */
  public static void main(String[] args) {
  // TODO Auto-generated method stub
  B b = new B();
  System.out.println("the variable testStr is:" + b.testStr);
  System.out.println("the variable staticStr is:" + B.staticStr);
  }
  }
  public class B extends A {
  static String staticStr = "static1";
  private String testStr = "Test1";
  /*
  * (non-Javadoc)
  *
  * @see A#initMethod()
  */
  public void initMethod() {
  // TODO Auto-generated method stub
  testStr = "Test2";
  staticStr = "static2";
  }
  /**
  * @return the testStr
  */
  public String getTestStr() {
  return testStr;
  }
  /**
  * @param testStr
  * the testStr to set
  */
  public void setTestStr(String testStr) {
  this.testStr = testStr;
  }
  /**
  * create data: 2009-12-29

  *
  * @author XiangJie
  * @param args
  *
  */
  public static void main(String[] args) {
  // TODO Auto-generated method stub
  B b = new B();
  System.out.println("the variable testStr is:" + b.testStr);
  System.out.println("the variable staticStr is:" + B.staticStr);
  }
  }

  大家给出的输出结果是什么呢?

  当然,这样的代码比较奇怪,但是现在只是为了说明这个问题而随便写的,在你的项目中遇到的问题有可能不是这样的。

  为了解释这个问题,先不给出代码,我们来一步步看!

  首先,静态变量初始化的问题,静态变量初始化是在类加载期间就已经进行了初始化,也就是说当在没有进行类初始化(注:类加载在类初始化之前)的时候staticStr = "static1"已经被保存在内存中了,而在该问题中你会发现,staticStr = "static2";是在改变已经保存在内存中的值,并且是在初始化之后进行的修改,所以对于静态变量的打印结果大家应该清楚了吧?

  其次,我们来分析类成员变量。

  这个就要牵涉到类初始的顺序了,B b = new B();就拿这个类的初始化来说明,当进行类的初始化的时候,首先,调用相应的构造函数(注:如果没有,默认的构造函数为B()),进入构造函数过后,它会首先进入父类的构造器,显然,我们的initMethod()就是在这种情况下被执行了,也就是说,在此刻的值为testStr = "Test2",父类执行完毕,再进入子类的构造器继续执行,进入子类过后首先对类成员变量进行初始化,这个就很明确了,现在的testStr="Test1"被执行.

  经过上述分析,结果应该很清楚了结果了吧?

  结果是:

  the variable testStr is:Test1
  the variable staticStr is:static2


标签:

本站文章除注明转载外,均为本站原创或翻译。欢迎任何形式的转载,但请务必注明出处、不得修改原文相关链接,如果存在内容上的异议请邮件反馈至chenjj@evget.com

文章转载自:网络转载

为你推荐

  • 推荐视频
  • 推荐活动
  • 推荐产品
  • 推荐文章
  • 慧都慧问
扫码咨询


添加微信 立即咨询

电话咨询

客服热线
023-68661681

TOP