java工程师 一道面向对象面试题

在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()创建子类对象时:

  1. 首先执行父类的初始化语句baseName="base"

  2. 执行父类的构造方法,调用callName()方法,但注意调用的是子类重写父类的callName()方法

  3. 这个时候子类中的baseName还没有进行到子类初始化语句执行那一步,baseName为null

所以结果为null


同时想到了重载,隐藏,覆盖

  1. 重载时在一个类中的方法动态性的体现

  2. 隐藏时子类和父类之间的关系,指的是在子类中声明的成员变量和静态方法而言的。

  3. 覆盖时子类和父类之间的关系,子类中具有和父类中成员方法同名,参数列表相同,返回值都相同,访问权限不缩小的方法。


你可能感兴趣的:(java,面试题)