java类加载和初始化顺序

来源:互联网 发布:淘宝店铺首页的作用 编辑:程序博客网 时间:2024/06/05 02:17

下面这是一道携程java工程师的面试题,求输出

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();    }}

这题考得知识点很基础,但一不小心,几年甚至十几年开发经验的老鸟都可能错。这道题考的就是java类的加载以及初始化的先后顺序。
构造器的初始化顺序大概是:父类静态块、子类静态块、父类初始化语句、父类构造器、子类初始化语句、子类构造器。
这道题子类父类都没有静态块,所以先进行的是父类初始化,然后是父类的构造器,父类的构造器调用了一个被子类重载了的方法,所以其实调的是子类的方法,然后悲剧就产生了,因为子类还没有被初始化,baseName还没有被赋值,所以本题的答案是:NULL
事实上,在构造器里面调用一个可能会被重载的方法,这本身就是一种危险的做法。但这道题出得还是不错的,借此巩固一下java基础!

0 0