子类没有重写父类的方法,子类的super调用的是父类方法吗?

当子类没有重写父类的方法的时候,子类的super调用的是父类方法吗?或者说当父类的非私有方法没有被子类重写,子类是拥有该方法只是没有显示出来吗?

相关代码

import java.util.Date;
public  class Test extends Date{
    public static void main(String[] args) {
        new Test().test();
    }
    
    public void test(){
        System.out.println(super.getClass().getName());
    }
}

题目来源及自己的思路

百度了这题的答案,原因是getclass方法是Object类的一个final方法,子类不能够重写,getclass方法返回的是一个当前运行类的Class对象。不能理解为什么super指向的运行时的对象是Test类

阅读 4.9k
2 个回答

用new Test().test();调用的当然获得的就是Test这个类,super关键字只是允许你调用父类的成员或者构造函数了,其实主要就是让你可以用来调用父类的构造函数和你的父类中 那些被你在子类中覆盖了 的方法,也可以调用隐藏字段(但java不鼓励这种做法)。
对象还是Test对象没有变,你就算将对象向上转换为Date,再去使用getClass方法得到的还是Test,因为你不过是改变了指向对象的引用变量的类型而已,对象还是那个Test对象。真想知道父类可以考虑用下面的代码

new Test().getClass().getSuperclass();

在你这个代码里加上super完全是没有必要的,不加super调用的也是父类的方法,因为getClass()又没有被覆盖。PS:其实父类的方法也是继承自它的父类的最终就是你查到的Object里面的那个getClass,因为是final的所以就这样一路继承下来了。

super指向的是Date,super.getClass()方法继承于Object的

public final native Class<?> getClass();//返回的是运行时的对象Test

所以打印的是test的包名

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题