本篇是1000期面试系列文章的第118期,持续更新中.....
回复“面试”获取优质面试资源!
面试专栏
精选1000 期 java相关面试题,以及技术知识点,帮助你提升技术、收割offer!
16篇原创内容
公众号
上一期中,笔试题,可能有人会觉得挺简单的,今天的你可否敢再试试,哈哈哈。这道题看起来也很简单。
请看题目
下面这段代码是否能运行?运行结果是什么?
package com.jiang;
/**
*
* @author 面试专栏
* @date 2021/7/11 15:52
*/
class Test {
}
public class Test2 extends Test {
public void test1() {
System.out.print(super.getClass().getName());
}
public void test2() {
System.out.print(this.getClass().getName());
}
public static void main(String[] args) {
Test2 test2 = new Test2();
test2.test1();
test2.test2();
}
}
这个题目很多朋友给出的答案,大概有三种:
-
第一种:
com.jiang.Testcom.jiang.Test2
-
第二种:
java.lang.Objectcom.jiang.Test2
-
第三种:
com.tian.Test2com.tian.Test2
你觉得是哪一种呢?还是都错了?
分析
知识点
考察super、getClass()、getName()。
在我们的Java语言中,提供了获取类名的方法:getClass().getName(),我们可以通过这种方式获取类名。那么通过调用父类的getClass().getName()方法就可以获取父类的类名了吗?
为了解释这个问题,我们不妨可以来试试下面这段代码:
package com.jiang;
class A {
}
public class B extends Test {
public void test1() {
System.out.println(super.getClass().getName());
}
public static void main(String[] args) {
B b = new B();
b.test();
}
}
运行结果:com.jiang.B
为什么输出的结果是B不是A呢?
主要原因在于Java语言中,任何类都隐形的继承于Object类,这里的getClass()方法在Object中被final与native修饰。
而子类不能覆盖此方法。因此,this.getClass和super.getClass最终调用的都是Object中的getClass()方法。而Object类中的getClass()方法的解释为:
Returns the runtime class of this {@code Object}.
返回此Object的运行时类
。由于在上面代码中,实际运行的类是B而不是A,因此,文章开头的代码运行结果为:com.tian.Test2com.tian.Test2
。
后记
这道题目,看似简单,但却很多人确实不知道,也没接触过这个点。
加油,每一道题目都有可能是你往后谈薪资的资本!
最后,记得帮忙点个赞哦!
推荐阅读