2015携程JAVA工程师笔试题(基础却又没多少人做对的面向对象面试题)

面向对象 面试题16道(附答案) 面向对象 面试题16道(附答案)1. 接口与抽象类的区别?2. 构造方法可否能被重写?3. (= =)与equals()的区别?4. 什么是拆箱和装箱?5. 方法重载(overload)需要满足什么条件,方法覆盖/方法重写(override)需要满足什么条件?6. 谈谈final,finally,finalize的区别。7. abstract的method是否可同时是static,是否可同时是synchronized?8. 接口是否可继承接口?抽象类是否可实现(implements)接口?实现类是否可继承抽 阅读详情

最近真的发现自己越来越懒了,虽然现在有点晚了,可是内疚完之后,还是得更新每个星期一篇的面试题,找了很多面试题,发现有些很基础的就没必要分享出来,最后找了这么一篇经典的面试题,一开始我也还真做错了,话不多说。来看下 2015 携程的 JAVA 工程师的面试题

一、题目


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.png

可以看到,结果为 null 。为什么呢?

我们在仔细的观察一下题目,可以知道,这道题无非就是考察我们三个知识点,第一,类的加载机制以及类的初始化过程;第二,继承的相关知识,其中这里涉及到子类继承父类的时候,同名的属性不会覆盖父类,只是会将父类的同名属性隐藏;第三,多态性,多态性就是让实现与接口进行分离,在这道题目中,在父类的构造方法中调用了虚函数造成多态

竟然我们上面就提到这个题目就是考察我们三个知识点,那么我们就根据题目对这三个知识点进行逐一击破

1.类加载的机制和程序运行的顺序

我们通过 Debug 能很好的了解程序的运行顺序,因为 new 了一个 Sub 对象,且 Sub 类中没有重写构造函数,因此会调用父类的构造函数,父类 Base 的构造函数中调用了 callName 方法,因此就在父类的 callName 方法中的输出语句打一个断点,最后因为子类的 Sub 重写了 callName 方法, 因此也在子类中重写的 callName 方法中打一个断点。最后通过 debug 我们可以看出程序的运行顺序

Debug查看运行的顺序.png

知道了程序的运行顺序之后,我们还需知道一个知识点,那就是类的实例变量的初始化过程,也就是题目中成员变量 baseName 的初始化过程。

我们都知道,一个类一旦被加载连接初始化,它就可以随时被使用了,程序可以访问它的静态字段,调用静态方法,或者创建它的实例。在 JAVA 程序中类可以被明确或者隐含地实例化有四种途径:(1)明确使用 new 操作符;(2)调用 Class 或者 Constructor 对象的 newInstance() 方法;(3)调用任何现有对象的 clone() 方法;(4)或者通过 objectInputStream 类的 getObject() 方法反序列化。虚拟机创建一个新的实例时,都需要在堆中为保存对象的实例分配内存。所有在对象的类中和它的父类中声明的变量(包括隐藏的实例变量)都要分配内存。一旦虚拟机为新的对象准备好堆内存,它立即把实例变量初始化为默认的初始值。

2.继承

题目中 Sub 类继承了 Base 类,关于继承,一个基本所有人都知道的知识点,不过这里还是贴出来

Java保证了一个对象被初始化前其父类也必须被初始化。有下面机制来保证:Java强制要求任何类的构造函数中的第一句必须是调用父类构造函数或者是类中定义的其他构造函数。如果没有构造函数,系统添加默认的无参构造函数,如果我们的构造函数中没有显示的调用父类的构造函数,那么编译器自动生成一个父类的无参构造函数

3.多态

父类中的构造函数调用了 callName 方法,在题目中是通过 new Sub() 对象,因此调用的是子类 Sub 类中的 callName 方法,因此当前的 this 是指 Sub 类中的。

好了,最后我们根据运行顺序分析整个过程
1.Base b = new Sub();

在 main 方法中声明父类变量b对子类的引用,JAVA类加载器将Base,Sub类加载到JVM;也就是完成了 Base 类和 Sub 类的初始化

2.JVM 为 Base,Sub 的的成员开辟内存空间且值均为 null

在初始化 Sub 对象前,首先 JAVA 虚拟机就在堆区开辟内存并将子类 Sub 中的 baseName 和父类 Base 中的 baseName(已被隐藏)均赋为 null ,至于为什么 Base 类中的 baseName 为什么会被隐藏,上面的知识点也已经说明,就是子类继承父类的时候,同名的属性不会覆盖父类,只是会将父类的同名属性隐藏

3.调用父类的无参构造

调用 Sub 的构造函数,因为子类没有重写构造函数,默认调用无参的构造函数,调用了 super() 。

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

调用了父类的构造函数,父类的构造函数中调用了 callName 方法,此时父类中的 baseName 的值为 base,可是子类重写了 callName 方法,且 调用父类 Base 中的 callName 是在子类 Sub 中调用的,因此当前的 this 指向的是子类,也就是说是实现子类的 callName 方法

5.调用子类的callName,打印baseName

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


public Sub(){
    super();
    baseName = "sub"; 
}

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

时间也很晚了(2016年12月27日01:35:54),最后给出一个知识点就睡了

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

Java充电站:梳理10道经典面向对象的面试题 1、面向对象都有哪些特性以及你对这些特性的理解? 继承:继承是从已有类得到继承信息创建新类的过程。提供继承信息的类被称为父类(超类、基类);得到继承信息的 类被称为子类(派生类)。继承让变化中的软件系统有了一定的延续性,同时继承也是封装程序中可变因素的重要手段。 封装:通常认为封装是把数据和操作数据的方法绑定起来,对数据的访问只能通过已定义的接口。面向对象的本质就是将现实世界描绘成一系列完全自治、封闭的对象。我们在类中编写的方法就是对实现细节的一种封装;我们编写一个类就是对数据和数据操作的封装。可以说, 阅读详情

相关推荐

Mplus—交叉滞后面板模型(Cross-Lagged Panel Model, CLPM)

本文介绍交叉滞后模型相关知识,以及显变量模型与潜变量模型在Mplus中的语法。

m0_54401011的博客 1万+

面向对象一些面试题汇总

接口和抽象类区别 抽象类:用abstract修饰,可以有普通方法和抽象方法,可以有变量,可以有构造方法,单继承 接口:用interface修饰,所有方法都是抽象方法,只能有final static修饰的全局常量,无构造方法,多实现 共同点:都不能通过new实例化对象 构造方法能否被重写 不能,子类和父类类名不同,而构造器和类名是同名的,故构造器不能继承,由于不能继承,故不能重写 ==和equals的区别 基本数据类型:= =比较两者值是否相同 引用数据类型:= =比较两者地址是否相同,equals比较二者值

qq_42667939的博客 1261

OLED的字模提取(保姆级)---基于PCtoLCD2013

做为一个刚刚开始接触编程不久的白菜,这个OLED想做一个信息显示,可是商家给我的例程里就是88,816两种字体的格式,我的屏幕是0.91寸的8*16的字体显示上感觉特别丢丢儿小,我就想整个大的,哎,只怪直接学习习惯不好,总是学一半,绕了好大一圈,才搞好,想写一篇博客,时刻提醒踏实学习,第一次写博客,小白一枚,勿喷。。 OLED屏幕驱动程序功能 我们对Markdown编辑器进行了一些功能拓展与语法支...

qq_44886611的博客 7781

【前端面试题】05—17道面向对象的面试题(附答案)

随着前端项目越来越大,如何使开发的代码更易拓展、更易维护、可读性更强等成为首要问题,因此越来越多的企业采用面向对象的开发技术。但 ECMAScript 6之前的JavaScript版本中,...

web前端开发 1381

黑猫带你学UFS协议第12篇:UFS标志(Flags)和属性(Atrributes)详解

UFS中的标志其实就是一些开关,布尔型,非0即1,打开或者关闭。这些标志可以用来使能或者禁止UFS设备的一些功能、模式或者状态。 简单来说,flag和attribute、discriptor一样,都是ufs的寄存器罢了。只不过spec将这些寄存器分类了,分成这三种大的类型了而已。 标志可以被清除、复位、设置、触发、读。 主机也是通过设备管理器的Query Request UPIU来读取或者写标志。

黑猫奥利奥的博客 2083

【OpenCV】第二十三章: 图像特征检测之SURF、FAST、BRIEF、OBR算法

4、由于在检测特征点时是需要对图像中所有的像素点进行检测,然而图像中的绝大多数点都不是特征点,如果对每个像素点都进行上述的检测过程,那显然是种浪费,所以FAST采用一种进行非特征点判别的方法:首先对候选点的周围90度的点(1,9,5,13)四个点进行测试,而且是先测试1和9,如果它们两个符合阈值要求再测试5和13。继SIFT和SURF后,大家在特征点检测的速度上又进行了很多的改进尝试,但速度的提升效果都不是非常明显,直到FAST算法诞生,特征点检测的速度才有了一个质的飞跃。无法计算描述符的特征点将被删除。

因为热爱所以坚持 2158

携程笔试题(含答案)

个人博客欢迎访问 总结不易,如果对你有帮助,请点赞关注支持一下 微信搜索程序dunk,关注公众号,获取博客源码、数据结构与算法笔记、面试笔试题 文章目录合成词展开(AC)方法一数组碰撞(AC)方法一 合成词展开(AC) 时间限制: 3000MS 内存限制: 589824KB 题目描述: 苏克·冯·望杜是印度著名的人工智能科学家。你正在试着阅读他的文章。但望杜写文章有个习惯,就是喜欢自己造词。他会利用现有的单词拼接上英语的一些前缀和后缀来快速造出一些新词。有些新词的组合十分复杂,读上去让人头大。作为程序员

qq_45796208的博客 4981

Claude Code 源码一夜流出:会看热闹的人很多,会读源码的人很少

摘要:Claude Code源码意外泄露后,作者分享了高效的源码学习方法:1)Fork仓库保存代码;2)使用Qoder的Repo Wiki功能生成结构化文档和UML图;3)基于Wiki创建可复用的Skill。这种方法比直接让AI总结代码更系统深入,并推荐了可视化学习项目辅助理解。文章强调实践的重要性,提供了具体工具和操作指南。

720

携程java有笔试吗_2015携程JAVA工程师笔试题(基础却又没多少人做对的面向对象面试题)...

最近真的发现自己越来越懒了,虽然现在有点晚了,可是内疚完之后,还是得更新每个星期一篇的面试题,找了很多面试题,发现有些很基础的就没必要分享出来,最后找了这么一篇经典的面试题,一开始我也还真做错了,话不多说。来看下 2015 携程的 JAVA 工程师的面试题一、题目public class Base{private String baseName = "base";public Base(){cal...

weixin_32448581的博客 109

CAMERALINK硬件封装说明

闲言少叙,直接上活,Cameralink硬件接口当前主要分为MDR26和SDR26两种,其中MDR对应封装较大价格比较便宜,SDR对应尺寸较小价格比较贵,这点我个人总是记错的图1 MDR26实物图图2 SDR26实物图。

6170

Linux存储软件栈剖析之第5篇:F2FS文件系统

F2FS是三星专为NAND闪存设计的开源文件系统,通过异地更新、磨损均衡等机制优化闪存特性。其架构采用层次化存储管理(Block→Segment→Section→Zone)和多日志区域设计,基于数据热度分类(热/温/冷数据)提升性能。核心创新包括节点地址表(NAT)解决级联更新问题,以及基于成本的垃圾回收算法。F2FS通过检查点机制确保崩溃一致性,并利用并行访问能力充分发挥闪存性能优势,显著降低写放大效应,延长设备寿命。

指尖动听知识库 199

JAVA携程为啥没人用呢_2015携程JAVA工程师笔试题(基础却又没多少人做对的面向对象面试题)...

最近真的发现自己越来越懒了,虽然现在有点晚了,可是内疚完之后,还是得更新每个星期一篇的面试题,找了很多面试题,发现有些很基础的就没必要分享出来,最后找了这么一篇经典的面试题,一开始我也还真做错了,话不多说。来看下 2015 携程的 JAVA 工程师的面试题一、题目public class Base{private String baseName = "base";public Base(){cal...

weixin_32237761的博客 80

YOLO系列专栏(十二):YOLO26行业落地实战(三):无人机航拍场景——户外巡检(机载边缘计算+YOLO26)

无人机航拍巡检场景,面临机载设备算力/显存有限、高空航拍目标小、户外环境复杂(风力、光线变化)、图像抖动等问题,对模型的轻量化、实时性、小目标检测能力要求极高。YOLO26相比传统模型,在该场景中具备三大核心优势:✅ 极致轻量化:INT8量化+模型剪枝后,模型体积可压缩至5MB以内,显存占用控制在512MB以内,适配Jetson Xavier NX等机载边缘计算设备;✅ 小目标检测能力强:优化检测头与锚框配置,可精准识别高空航拍中的小尺寸目标(如线路断股、绝缘子裂纹),检测准确率高;

qq_36130719的博客 258

携程java笔试题目_2015携程JAVA工程师笔试题(基础却又没多少人做对的面向对象面试题)...

最近真的发现自己越来越懒了,虽然现在有点晚了,可是内疚完之后,还是得更新每个星期一篇的面试题,找了很多面试题,发现有些很基础的就没必要分享出来,最后找了这么一篇经典的面试题,一开始我也还真做错了,话不多说。来看下 2015 携程的 JAVA 工程师的面试题一、题目public class Base{private String baseName = "base";public Base(){cal...

weixin_30698721的博客 259

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

java最初被定义为啥_2015携程JAVA工程师笔试题(基础却又没多少人做对的面向对象面试题)...

题目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";publ...

weixin_30063287的博客 74

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

名企笔试:2015携程Java工程师笔试题

名企笔试:2015携程Java工程师笔试题 下列Java代码中的变量a、b、c分别在内存的__存储区存放。classA{   private String a= "aa";   publicbooleanmethodB(){   String b= "bb";   final String c= "cc";   } }A. 堆区、堆区、堆区 B. 堆区、栈区、堆区 C. 堆区、

荆州长江大学 余攀(Java学生) 572

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

Java 基础面试题——面向对象

本文记录了 Java 中与面向对象相关的面试题。

代码星辰的博客 3203

若二叉树采用二叉链表作存储结构,要交换其所有分支结点的左右子树的位置,采用()遍历方法最合适?

若二叉树采用二叉链表作存储结构,要交换其所有分支结点的左右子树的位置,采用()遍历方法最合适? A前序 B中序 C后序 D按层次     答案:C 用二叉链表存储结构也就是左孩子右兄弟的存储结构。 后序遍历比较合理。正常的逻辑应该就是:做好当前结点子树内部的交换,然后交换当前结点的左右子树。刚好符合后序遍历的算法逻辑。 1. 交换好左子树 2. 交换好右子树 3. 交换左...

adolph_zhao的博客 3万+

web前端面向对象面试25题

【代码】web前端面向对象面试25题。

柯晓楠 665

转:Java 面向对象 面试题

1、封装具有的特性? 答:(1)在类的定义中设置访问对象属性(数据成员)及方法(成员方法)的权限,限制本类对象及其他类的对象使用的范围。 (2)提供一个接口来描述其他对象的使用方法 (3)其他对象不能直接修改本对象所拥有的属性和方法 (4)封装反映了事物的相对独立性  (5)封装在编程上的作用是使对象以外的部分不能随意存取对象的内部数据(属性),从而有效地避免了外部错误对它的“交叉感染...

qq_39380155的博客 677

⛳ 面向对象面试题

在JDK1.7及之前,HotSpot虚拟机将Java信息,常量池,静态变量,即使编译后的代码(JIT)等数据,存储在Perm(永久代)里(对于其它虚拟机如BEA JRockit、IBM J9等是不存在永久带概念的),类的元数据和静态变量在类加载的时候被分配到Perm里,当常量池回收或者类被卸载时,垃圾收集器会回收这部分内存,但效果不太理想。​ 由于是实例的一部分,在类初始化的时候,从运行时常量池取出直接引用或者值,与初始化的对象一起放入堆中。的限制,所以此配置已经失效了,现在可以使用更多的本地内存。

松柏123的博客 1901

面向对象面试题集合

记录面向对象面试题相关内容,方便复习及查漏补缺。

溫問問 1200

Batch Normal - 批量规范化(CNN卷积神经网络)

BatchNorm、批量数据规范化

西小庄村高伟 的博客 2207

二叉树交换左右子树

#include #include typedef struct Node{    int data;  struct Node* LChild;  struct Node* RChild; }Tree; void createTree(Tree **T) {  int data = 1;  scanf("%d",&data);  if ( data != 0)  {

2万+
上一篇: 2016滴滴出行研发工程师笔试题(亮灯问题)
下一篇: 我的2016都在升值地卖命和卖命地升值
Two_Water
博客等级 码龄12年 573粉丝 134原创
评论 20
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值