下面这是一道携程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基础!