最近这道面试题,传遍程序员各大小园地,本小白特摘抄整理与大家一起学习:

原题:

package com.gxlee;

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();
        System.out.println(b);
    }
}

求这段程序的输出。

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

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

1、Base b = new Sub();

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

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

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

3、new sub()

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

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

  public Base(){

  baseName= "base";

  callName();

}

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

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

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

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

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

  public Sub(){

  super();

   baseName = "sub";

}

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

总结:

未老莫还乡 的评论:

【不要在构造器里调用可能被重载的虚方法,这是极度危险的】。

  构造器的初始化顺序大概是:父类静态块 ->子类静态块 ->父类初始化语句 ->父类构造函器 ->子类初始化语句 子类构造器。

父类构造器执行的时候,调用了子类的重载方法,然而子类的类字段还在刚初始化的阶段,刚完成内存布局,只能输出null。

最近很火的携程Java 工程师的一道面向对象面试题的更多相关文章

  1. 携程Java工程师——一道面向对象面试选择题(转)

    public class Base { private String baseName = "base"; public Base() { callName(); } public ...

  2. 最新 携程java校招面经 (含整理过的面试题大全)

    从6月到10月,经过4个月努力和坚持,自己有幸拿到了网易雷火.京东.去哪儿.携程等10家互联网公司的校招Offer,因为某些自身原因最终选择了携程.6.7月主要是做系统复习.项目复盘.LeetCode ...

  3. 携程Java后台开发三面面经

    前言 携程是我面试的第一个互联网公司,投递的岗位是后台开发实习生,总共面了三面,止步于人才库.中间兜兜转转,复杂的心理活动,不足与外人道也.唯有面试的技术部分与大家共享. 宣讲会完了之后有个手写代码的 ...

  4. Java程序员备战“金九银十”必备的面试技巧(附携程Java岗面试题)

    一.面试前的准备 1.1 如何准备一场面试1.1.1 如何获取大厂面试机会1.1.2 面试必知 ①. 准备介绍自己 ②. 关于着装 ③ .随身带上自己的成绩单和简历 ④. 如果笔试就提前刷一些笔试题 ...

  5. 初级Java工程师面试所遇面试题

    1.servlet的生命周期 : 一.百度百科 : 1.客户端请求servlet: 2.加载servlet类到内存: 3.实例化并调用init()方法初始化servlet: 4.调用service() ...

  6. Java工程师面试linux操作选择面试题大全

    1.请写出常用的linux指令不低于10个,请写出linux tomcat启动.linux指令arch 显示机器的处理器架构(1)uname -m 显示机器的处理器架构(2)shutdown -h n ...

  7. 剑指Offer——携程笔试题+知识点总结

    剑指Offer--携程笔试题+知识点总结 情景回顾 时间:2016.9.17 19:10-21:10 地点:山东省网络环境智能计算技术重点实验室 事件:携程笔试 总体来说,携程笔试内容与其它企业笔试题 ...

  8. Asp.Net Core与携程阿波罗(Apollo)的第一次亲密接触

    一.瞎扯点什么 1.1 阿波罗 ​ 阿波罗是希腊神话中的光明之神.文艺之神,同时也是罗马神话中的太阳神:他是光明之神,从不说谎,光明磊落,在其身上找不到黑暗,也被称作真理之神.他非常聪明,通晓世事,是 ...

  9. 携程阿波罗(Apollo)配置中心

    携程阿波罗(Apollo) https://www.cnblogs.com/xiaxiaolu/p/10025597.html 一.瞎扯点什么 1.1 阿波罗 ​ 阿波罗是希腊神话中的光明之神.文艺之 ...

随机推荐

  1. jquery实现页面置顶功能代码

    <html> <head> <title></title><script type='text/javascript> //回到顶部功能 f ...

  2. yii2源码学习笔记

    assets   前端资源文件夹,用于管理css js等前端资源文件等 commands   包含命令行命令,文件为控制器文件 config 应用的配置文件 controllers 控制器文件 mai ...

  3. 网易DBA私享会分享会笔记1

    1.mysql生态+DBA职业发展世界范围流行的开源关系型的数据库关系型数据库:mysql,oracle,sql server,access,postgresql,sqlite,sybase,info ...

  4. python设计模式之观察者模式

    观察者模式 当对象间存在一对多关系时,则使用观察者模式(Observer Pattern).比如,当一个对象被修改时,则会自动通知它的依赖对象.观察者模式属于行为型模式. 观察者模式在状态检测和事件处 ...

  5. 实验一:基于Winsock完成简单的网络程序开发

    第一部分:简答的UDP网络通信程序 // UDP5555.cpp : Defines the entry point for the application. //================== ...

  6. Unable to boot device in current state: Creating

    安装完xcode6.1后,将其改名为Xcode6.1.app,再移动个位置,启动模拟器,问题来了: Unable to boot device in current state: Creating 解 ...

  7. 转:php页面静态化之真静态

    之前的缓存和现在所说的页面静态化都是为网站提速的,如果是访问量小的小型网站可能不需要但是如果网站规模或访问量很大,那么页面静态化和缓存就会体现出各自的价值了下面先来了解下页面静态化的分类 页面静态化的 ...

  8. 简单对比Spark和Storm

    2013年参与开发了一个类似storm的自研系统, 2014年使用过spark 4个多月,对这两个系统都有一些了解. 下面是我关于这两个系统的简单对比: Spark: 1. 基于数据并行,https: ...

  9. hdu 3912 Turn Right

    http://acm.hdu.edu.cn/showproblem.php?pid=3912 这个题我用递归深搜模拟,直接爆栈了.哭啊!为什么! 这个题最主要是能走重复格子,但是方向不一样. 我用的剪 ...

  10. 【HDOJ】1276 士兵队列训练问题

    初看这道题目很像尤瑟夫问题, 区别是每次都是从1开始.解法也很类似.数学解递推公式.假定第K次报数后,余下人数不超过3个人.若第K次为1-3报数,那么由这三个数的当前索引n可推上一次报数之前的编号为n ...