先看代码
public class A {
public A() {
System.out.println ("This is Class A");
}
public A(String str) {
System.out.println ("This is Class " + str);
}
{
System.out.println ("Hello Class A");
}
static {
System.out.println ("Class A");
}
public void print() {
System.out.println ("Hello A");
}
}
public class B extends A {
public B() {
System.out.println ("This is Class B");
}
{
System.out.println ("Hello Class B");
}
static {
System.out.println ("Class B");
}
public void print() {
System.out.println ("Hello B");
}
public static void main(String[] args) {
B b = new B();
b.print();
}
}
上述代码执行结果:
Class A
Class B
Hello Class A
This is Class A
Hello Class B
This is Class B
Hello B
可以看到Class B中并没有显式调用Class A的构造函数,而执行结果中却打印出了“This is Class A”,这是因为当Class B中的构造函数中没有显式调用父类构造函数时,编译器会在Class B的第一行插入了“super()”,就有了上面的执行结果;
同时还需要注意static和大括号所对应的代码段
{
System.out.println ("Hello Class A");
}
static {
System.out.println ("Class A");
}
static + 大括号的代码段,在类加载时调用,整个生命周期中仅调用一次
大括号对应的代码段,在每次新建对象时调用