在ImportNew微信公众号上看到的一道携程java工程师的一道面向对象面试题:
public class Base{
private String baseName="base";
public Base(){
callName();
}
public void callName(){
System.out.println(baseName);
}
static class Stub extends Base{
private String baseName="sub";
public void callName(){
System.out.println(baseName);
}
}
public static void main(String[]args){
Base base=new Stub();
}
}
写出这段程序的执行结果
首先要明确创建子类对象时构造方法和初始化的执行顺序:父类静态块-》父类初始化语句-》父类构造方法-》子类静态块-》子类初始化语句-》子类构造方法
在调用new Stub()创建子类对象时:
首先执行父类的初始化语句baseName="base"
执行父类的构造方法,调用callName()方法,但注意调用的是子类重写父类的callName()方法
这个时候子类中的baseName还没有进行到子类初始化语句执行那一步,baseName为null
所以结果为null
同时想到了重载,隐藏,覆盖
重载时在一个类中的方法动态性的体现
隐藏时子类和父类之间的关系,指的是在子类中声明的成员变量和静态方法而言的。
覆盖时子类和父类之间的关系,子类中具有和父类中成员方法同名,参数列表相同,返回值都相同,访问权限不缩小的方法。
原文:http://11195953.blog.51cto.com/11185953/1741963