`

《thinking in java》第四章:初始化与清理三

阅读更多

http://quicker.iteye.com/blog/548770

http://quicker.iteye.com/blog/548787

前两文已经对JAVA初始化作了说明,本文以一个例子进行补充。

规则:

  1.       Java程序执行前必须先加载,先定位加载开始类(public的类),若存在继承关系,由父类开始加载,加载时必须初始化static成员变量。
  2.          加载时若遇到新的类,必须先对该类进行加载,方法如上。
  3.          加载完后再执行,执行时由main()方法开始。若存在继承,调用子类的构造方法,必须先执行其父类的构造方法。
  4.          执行构造函数前必须先初始化该类的成员变量,但static成员变量只需要初始化一次。
  5.          成员变量不能用自身的构造函数进行初始化,除非声明其为static

代码示例:

class Goods{
	Goods(){
		System.out.println("goods");
	}
}

class Meal {
  static Meal ml = new Meal(1);  
 // private Meal s = new Meal(2);  // stackOverFlow exception
  								  //成员变量不能用自身的构造函数,除非声明为static.
  private Bread b = new Bread(3);  
  Meal() { System.out.println("Meal()"); }
  Meal(int i) { System.out.println("Meal()" + i); }
}

class Bread {
  static Bread ml = new Bread(2);
  Goods g = new Goods();
  
  Bread() { System.out.println("Bread()"); }
  Bread(int i) { System.out.println("Bread()" + i); }
}

class Lunch extends Meal {
  Lunch() { System.out.println("Lunch()"); }
}

class PortableLunch extends Lunch {
  PortableLunch() { System.out.println("PortableLunch()"); }
}

public class SandWich extends PortableLunch {
  static Bread bb = new Bread();  
  private Bread b = new Bread();
  public SandWich() { System.out.println("SandWich()"); }
  public static void main(String[] args) {
	  System.out.println("---------------------------------------");
    new SandWich();
  }
}

 

如果能说出代码结果就表明过关。。

goods
Bread()2
goods
Bread()3
Meal()1
goods
Bread()
---------------------------------------
goods
Bread()3
Meal()
Lunch()
PortableLunch()
goods
Bread()
SandWich()

 

针对代码中:

class Meal {
  static Meal ml = new Meal(1);  
 // private Meal s = new Meal(2);  // stackOverFlow exception
  								  //成员变量不能用自身的构造函数,除非声明为static.
  private Bread b = new Bread(3);  
  Meal() { System.out.println("Meal()"); }
  Meal(int i) { System.out.println("Meal()" + i); }
}

 // private Meal s = new Meal(2);  // stackOverFlow exception

上面代码当声明为static的时候,只初如化一次,而非static声明Meal的实例,在调用构造函数之前需要初始化Meal类的成员变量,这样会不断地重复动作,最后抛出异常。

类似下面这段代码:

class Meal {
  static Meal ml = new Meal(1);  
 // private Meal s = new Meal(2);  // stackOverFlow exception
  								  //成员变量不能用自身的构造函数,除非声明为static.
  private Bread b = new Bread(3);  
  Meal() { System.out.println("Meal()"); }
  Meal(int i) { System.out.println("Meal()" + i); }
  
  public static void main(String[] args) {
	new Meal();
  }
}

 这个问题下贴有表述:

http://hi.baidu.com/yang1101190/blog/item/beb856c34c47865eb219a875.html

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics