对Java进行初始化应避免的问题

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

  请看代码:

  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

添加新评论