看了think in java,有一章提到了静态以及一篇非静态的初始化。心血来潮过一遍。
静态初始化,大家都熟悉。
比如这样一个例子。
package com.tudou.t1;
public class StaticTest {
public static void main(String[] args) {
System.out.println("main");
Cups.cup1.print();//1
//Cups cups=new Cups();//2
}
}
class Cup {
Cup(int i) {
System.out.println("cup:"+i);
}
void print() {
System.out.println("print");
}
}
class Cups {
static Cup cup1;
static Cup cup2;
static {
cup1 = new Cup(1);
cup2 = new Cup(2);
}
Cups() {
System.out.println("cups...");
}
}
不管你是注释1还是注释2处的代码,控制台都会打印:
main
cup:1
cup:2
以上3句。说明无论你是new还是访问一个对象的方法,它都会调用一次static变量。而且仅此一次。static作用的是全局的域。
而非静态实例化,其实就是去掉static的代码块。用{}包起来的代码块。
package com.tudou.t1;
public class ConstructorTest {
public static void main(String[] args) {
System.out.println("第1台电脑:");
new Computer();
System.out.println("第2台电脑:");
new Computer(2);
}
}
class Computer {
public Computer() {
System.out.println("computer");
};
public Computer(int i) {
System.out.println("computer" + i);
};
Cpu c1;
Cpu c2;
{
c1 = new Cpu("INTEL");
c2 = new Cpu("AMD");
}
}
class Cpu {
String cpuname;;
public Cpu(String cpuname) {
this.cpuname=cpuname;
System.out.println("cpu:" + cpuname);
}
}
以上例子说明,无论你是调用有参的Cumputer,还是无参的Cumputer,Cpu都会初始化。这样你就不必在每个初始化中调用Cpu的初始化了。他使得无论你在调用哪种构造器时,某些操作都是必须发生的。