课程咨询 :13691148991

上海java培训 > 合作企业 > 企业笔试题 > Java工程师--面向对象面试题
  • Java工程师--面向对象面试题

    发布:上海java培训      来源:企业笔试题      时间:2015-10-16

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

    求这段程序的输出。

    未老莫还乡 的评论:

    【不要在构造器里调用可能被重载的虚方法,这是极度危险的】。构造器的初始化顺序大概是 父类静态块 子类静态块 父类初始化语句 父类构造函器 子类初始化语句 子类构造器。父类构造器执行的时候,调用了子类的重载方法,然而子类的类字段还在刚初始化的阶段,刚完成内存布局,只能输出null。

    ihuning 的精华评论:

    看我大师归来:

    1. Base b = new Sub();

    2. Base b = 直接忽略,从 new Sub();开始

    3. 类加载器加载 Base,Sub 类到jvm;

    4. 为Base,Sub 类中的两个属性baseName 分配存储空间,但是不初始化;

    注意:属性的初始化时放在构造器中,按照代码顺序执行的。

    5. new Sub会调用Sub的无参构造器,而在这个构造器中会隐式调用父类Base的无参构造器;

    6. 父类Base的构造器中代码本质是

    public Base()

    {

    baseName = "base";

    callName();

    }

    即父类的属性baseName 的值为base。但为何输出null,骚年别急。

    7. 因为父类构造器方法是在子类中调用的,即大环境是子类。此时,调用的方法callName()当然是指子类的方法。而这个方法打印的属性baseName当然也是子类的。那现在子类的属性baseName的值是多少呢?答案是null.因为此时子类Sub的构造器内代码本质是:

    super();

    baseName="sub";

    此时baseName="sub"还没执行。

    因此,左后的值当然是null.


上一篇:Java Web基础笔试题

下一篇:java软件工程师--常见基础面试题

最新开班日期  |  更多

Java--零基础全日制班

Java--零基础全日制班

开班日期:1.20

 Java--零基础业余班

Java--零基础业余班

开班日期:1.18

Java--大数据全日制班

Java--大数据全日制班

开班日期:1.20

Java--大数据业余制班

Java--大数据业余制班

开班日期:1.18

  • 地址: 上海达内12大校区,就近安排,提供住宿(浦东/徐汇/人广/静安/虹口等)
  • 课程培训电话:13691148991     24小时咨询电话:150-2157-9486
  • 服务邮箱 ts@tedu.cn
  • 2001-2016 达内时代科技集团有限公司 版权所有 京ICP证8000853号-56