企业真实面试:父子类之间到底是怎么实例化的?
一. 问题展现
今天有粉丝向小编询问了这样一道题目,这道题目是粉丝在面试时遇到的,如下图所示:
把上图这道题目的考察重点给大家梳理一下:
有一个父类People,它有一个子类Child;
父类的的无参构造方法会输出“1”,有参构造方法会输出“2”;
Child子类给了一个成员变量,有参构造方法会输出“3”;
我们再去实例化一个people对象,无参方法会直接输出“4”;
问:此时new Child("mike"),输出的结果及其顺序是什么?
如果在不看后面的内容之前,你能不能给出正确答案呢?如果你知道结果,请在评论区给出答案呗。
二. 解决思路
现在请各位小伙伴,开动你的脑筋,让我们一起来解答吧。
其实这道题,说难也不难,说简单吧,也不是那么容易。当然,相信大家肯定能把这个题目搞定,接下来就把这个解题过程给大家讲解一下。
1.调用父类的无参构造方法
首先我们需要弄清楚一个问题,类是如何进行实例化的。我们知道,类一般是通过构造方法来进行实例化。比如上面的题目,Father类的有参构造方法传递进来了一个String类型的参数“mike”。但当我们调用有参构造方法时,子类中所有的构造函数也都会默认调用父类的无参构造方法,因为每一个子类的构造方法中第一行都会隐式调用
因此在本案例中,实例化Child时,会先调用其有参构造方法。在进入到Child的有参构造方法后,接着就会去寻找Child的父类的无参构造方法,也就是People类的无参构造方法。由此,第一个结果就输出了“1”。
2.执行Child的有参构造方法
接下来就会执行Child类自己的有参构造方法,如下:
所以接着就会输出“3”。
3.执行People类的有参构造方法
再接下来,我们会看到Child有参构造方法的代码中,会再次实例化调用People的有参构造方法,如下所示:
所以就输出了结果“2”。因此,本案例的输出结果分别为“1”、“3”、“2”。
4.代码验证
当然,口说无凭,让我们通过实验来验证一下吧,代码截图如下:
但这里其实还有一个神奇的现象,可以给各位小伙伴进行灵魂一击!大家可以在上述代码中,分别输出此时Child的name参数,People的name参数,成员变量father的参数,看看会是什么结果?大家可以自行思考实现。
先透露最终的答案:{Child.name:“mike”},{People.name:"mike"},{father.name:"mikeF"}。但你要知道为什么会这样,请你思考一下吧。提示一下,请重点关注这两行代码:
三. 结语
以上就是小编对本次实例化问题的讲解过程,希望各位在看完本文之后,能够对继承关系实例化有一个更深的了解。
相关推荐HOT
如何快速入门怎样学习java
要快速入门学习Java,你可以按照以下步骤进行:设置开发环境:首先,在你的计算机上安装Java开发工具包(JavaDevelopmentKit,JDK)。你可以从Ora...详情>>
2023-06-05 16:19:00SpringBoot整合JDBCTemplat
Spring Boot 是一个快速构建基于 Spring 框架的应用程序的工具,而 JdbcTemplate 是 Spring 框架中用于执行 SQL 语句的类。下面是 Spring Boot ...详情>>
2023-03-20 19:29:44举例说明什么情况下会更倾向于使用抽象类而不是接口?
接口和抽象类都遵循”面向接口而不是实现编码”设计原则,它可以增加代码的灵活性,可以适应不断变化的需求。下面有几个点可以帮助你回答这个问...详情>>
2022-11-07 14:34:20实例化创建对象有哪几种方式
1. new2. clone()3. 通过反射机制创建4. 序列化反序列化。反射示意代码:// Class.forName方法获取类,在调用类的newinstance()方法 Class cls ...详情>>
2022-11-07 14:33:23热门推荐
依赖注入实现原理?
沸如何快速入门怎样学习java
热SpringBoot整合JDBCTemplat
热一个bug的解决过程,让你明白阅读源码的重要性
新Redis的持久化机制有哪几种
高频面试题 - RabbitMQ如何防止重复消费问题
HashMap与ConcurrentHashMap的区别
线程和进程区别
JVM 是如何处理异常的?
如何实现跨域?说一下JSONP实现原理?
企业真实面试:父子类之间到底是怎么实例化的?
什么是 Spring Boot?Spring Boot 有哪些优点?
你了解过哪些同步器?请分别介绍下
新手java编程什么软件好