做Java开发的,起码要知道类的初始化顺序,因为这样你才知道编写的代码运行到了那里。
与文无关一段代码
public class BaseTest {
private String baseName = "baseName";
static {
System.out.println("父类静态代码块");
}
public BaseTest() {
System.out.println("父类构造方法");
callName();
}
public void callName(){
System.out.println(baseName);
}
static class Sub extends BaseTest{
private String baseName = "subName";
public Sub() {
System.out.println("子类构造方法");
}
static {
System.out.println("子类静态代码块");
}
@Override
public void callName() {
System.out.println(baseName); //输出为null
super.callName(); //输出baseName,baseStatic
}
}
public static void main(String[] args) {
Sub sub = new Sub();
}
}
以上代码运行的结果如下:
父类静态代码块
子类静态代码块
父类构造方法
null
baseName
子类构造方法
为什么在子类中直接调用 System.out.println(baseName),输出为null呢?
在创造派生类的过程中首先创建基类对象,然后才能创建派生类。创建基类即默认调用BaseTest()方法,在方法中调用callName()方法,由于派生类中存在此方法,则被调用的callName()方法是派生类中的方法,此时派生类还未构造,所以变量baseName的值为null
静态代码块的初始化
public class StaticTest {
static {
System.out.println("父类的静态代码块");
}
public static String str = getStr();
private static String getStr() {
System.out.println("父类的静态方法");
return "str1";
}
public StaticTest() {
System.out.println("父类构造方法");
}
static class SubStatic extends StaticTest{
static {
System.out.println("子类的静态代码块");
}
public static String str1 = getStr1();
private static String getStr1() {
System.out.println("子类的静态方法");
return "str1";
}
public SubStatic() {
System.out.println("子类构造方法");
}
}
public static void main(String[] args) {
new SubStatic();
}
}
运行结果:
父类的静态代码块
父类的静态方法
子类的静态代码块
子类的静态方法
父类构造方法
子类构造方法
最后
动手操作,查看了下类的初始化过程。