源码如下:

    class Fu{

        public Fu(){

            print();

        }

        int i = 10;

        void print(){

            System.out.println("父:"+i);

        }

    }

    class Zi extends Fu{

        public Zi(){

            print();

        }   

        int i = 20;

        void print(){

            System.out.println("子:"+i);

        }

    }

    public class Test{

        public static void main(){

            new Zi();

        }

    }

控制台输出:

    子:0

    子:20

效果解析:

    1.main方法new了子类,子类构造中自动调用父类的构造,相当于调用了两次print()方法,控制台输出了两次。

    2.由于子类继承父类,调用父类的构造方法,调用者其实还是子类,构造方法中的print()其实是this.print(),this代表的是调用者,那么就是子类,所以两次调用的print()方法都是子类的方法。

    3.第一次输出时i为0,其实是java虚拟机的运行机制问题,第一次输出i时,子类中的i并没有进行初始化,所以输出的是int的默认值0.