A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 我若为神 中级黑马   /  2015-11-8 22:31  /  607 人查看  /  1 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

携程网的面试题,看答案都迷迷糊糊的
  1. package com.gxlee;

  2. public class Base {
  3.     private String baseName=  "base";
  4.     public Base() {
  5.         callName();
  6.     }
  7.     public void callName(){
  8.         System.out.println(baseName);
  9.     }
  10.    
  11.     static class Sub extends Base{
  12.         private String baseName = "sub";
  13.         public void callName(){
  14.             System.out.println(baseName);
  15.         }
  16.     }
  17.     public static void main(String[] args) {
  18.         Base b = new Sub();
  19.         System.out.println(b);
  20.     }
  21. }

  22. 求这段程序的输出。

  23. 解答此题关键在于理解和掌握类的加载过程以及子类继承父类后,重写方法的调用问题:

  24. 从程序的执行顺序去解答:

  25. 1、Base b = new Sub();

  26.   声明父类变量b对子类的引用,JAVA类加载器将Base,Sub类加载到JVM;

  27. 2、JVM为Base,Sub 的的成员开辟内存空间

  28.   此时,Base 和Sub类中的值为null;

  29. 3、new sub()

  30.   调用构造函数,由于Sub类继承自Base而无自定义构造器,因此先调用父类Base的无参构造;

  31. 4、父类午餐构造的本质为:

  32.   public Base(){

  33.   baseName= "base";

  34.   callName();

  35.     }

  36.   即将父类的baseName赋值为“base”,赋值后调用callName();

  37. 5、callName 在子类中被重写,因此调用子类的callName();

  38. 6、调用子类的callName,打印baseName

  39.   此baseName为子类Sub的成员变量,而此时该成员尚未初始化,因此为Null;

  40. 7、实际上在new Sub()时,实际执行过程为:

  41.   public Sub(){

  42.       super();

  43.    baseName = "sub";

  44.     }

  45.   可见,在baseName = "sub"执行前,子类的callName()已经执行,所以子类的baseName为默认值状态null;
复制代码


1 个回复

倒序浏览
澤光有潤紅頭龜 来自手机 中级黑马 2015-11-8 22:35:22
沙发
… 好屌
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马