public class Base
{
    private String baseName = "base";
    public Base()
    {
        callName();
    }
 
    public void callName()
    {
        System. out. println(baseName);
    }
 
    static class Sub extends Base
    {
        private String baseName = "sub";
        public void callName()
        {
            System. out. println (baseName) ;
        }
    }
    public static void main(String[] args)
    {
        Base b = new Sub();
    }
}
 
 
 

1:这段程序在控制台上输出的是null,首先在new对象时会初始化父类的成员变量和构造器,父类构造器里的方法在子类中进行了重写,所以会调用子类的这个callName()方法,但是这个时候子类的成员变量还未进行初始化所以默认值为null.

2:没有继承的java初始化顺序

1)首先会执行初始化static成员变量(static代码块也可以看做是static成员变量,所以执行顺序看他两在程序中出现的顺序)

2)初始化普通的成员变量

3)初始化构造函数

3:有继承的java初始化顺序

1)初始化父类的static成员变量和静态代码块

2)初始化子类的static成员变量和静态代码块

3)初始化父类的成员变量

4)初始化父类的构造方法

5)初始化子类的成员变量

6)初始化子类的构造函数