public class Sub extends Super{
static{
System.out.println("static");
}
{
System.out.println("实例化器"); //这一段就是,在构造方法之后。
} public static void main(String[] args) {
new Sub();
}
}
static{
System.out.println("static");
}
{
System.out.println("实例化器"); //这一段就是,在构造方法之后。
} public static void main(String[] args) {
new Sub();
}
}
public class Sub {
static {
System.out.println("static");
} {
System.out.println("实例化器"); // 这一段就是,在构造方法之后。
} static {
System.out.println("static2");
} public Sub() {
System.out.println("sub");
}
public static void main(String[] args) {
new Sub();
}}static
static2
实例化器
sub
没发觉在构造方法之后,到是感觉在静态方法之后
在你new XXX()的时候,它就执行了。
System.out.println("实例化器"); //这一段就是,在构造方法之后。
}叫做非静态初始化,它将会在类被new过一次的时候,调用(只调用1次)
static {
System.out.println("static");
}
叫做静态初始化,它将会在类被装载的时候调用(也只调用一次)
你在main里再加一个new Sub(); 会发现每次new都会调用的
你在main里加个new Sub() 再看“叫做非静态初始化,它将会在类被new过一次的时候,调用(只调用1次)”
而{ }实例化块是调用构造函数之前,调用一次。每次new都会调用。绝对正确的理解
Java_gannbare说的没错
static{
System.out.println("static");
}这点thinking in java上有说过啊,从未创建某个类的任何对象,也可以调用其static方法或访问其static域
也就是说static内部是静态方法,程序编译时就生成了,不需要new,一样会调用
package test;import static java.lang.System.*;
import static java.util.Calendar.*;public class HelloWorld {
static {
out.println("Hello Word");
System.exit(0);
out.println(AM);
}
}class HelloWorld2 extends HelloWorld {
static {
out.println(AM);
}
}另一版本 HelloWorld..
静态代码块中的代码会在该类.class文件被ClassLoader加载时执行,只会执行一次,因此他肯定会在这个类被实例化之前就执行。这个特性决定他适合某些方面的需求,比如Class.forName(db的driver类路径)
{}这个是非静态初始化
静态初始化只执行一次运行于构造函数前面
此处有总结。关于“类和实例的代码初始化器”。