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)初始化子类的构造函数

原文:http://www.cnblogs.com/wyc520/p/5244299.html