A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 余银桂 中级黑马   /  2012-6-21 23:24  /  2302 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 余银桂 于 2012-6-22 00:10 编辑
  1. import java.util.Date;
  2. public  class Test extends Date{
  3.         public static void main(String[] args) {
  4.                 new Test().test();
  5.         }
  6.         
  7.         public void test(){
  8.                 System.out.println(super.getClass().getName());
  9.         }
  10. }
复制代码
输出结果是 Test
为什么没有获取到父类的名称?

评分

参与人数 1技术分 +1 收起 理由
黄奕豪 + 1 赞一个!

查看全部评分

6 个回复

倒序浏览
本帖最后由 鲍永章 于 2012-6-21 23:35 编辑

调用super.getClass()和调用this.getClass();是一样的,因为this.getClass()是从父类继承的,是Object类的方法
个人理解,这个方法是获取当前实际对象的类

你从Date继承,Date这个类里应该也没有getClass方法,总之最终是从Object继承来的,这个方法只有一个,所以是不是super都一样,结果肯定是根据实际new的对象类型决定的

评分

参与人数 1技术分 +1 收起 理由
黄奕豪 + 1 赞一个!

查看全部评分

回复 使用道具 举报
由于getClass()在Object类中定义成了final,子类不能覆盖该方法,所以,在test方法中调用super.getClass().getName()方法等效于调用getClass().getName()方法,都是在调用从父类继承的 getClass()方法,所以super.getClass().getName()方法返回的也应该是Test。
如果想得到父类的名称,应该用如下代码:
getClass().getSuperClass().getName();

super不是超类的引用,而是表示在子类中调用父类的方法或属性而已
  1. class B extends A {
  2.      public void print() {
  3.            System.out.println(super.getClass());//调用A类中的getclass()方法,A是Object的子类,A中的getClass()是Object中的,运行时期的实例是B类,所以输出的依然是Class B
  4.            System.out.println(this.getClass()); //调用B类中的getclass()方法,此方法从A继承的,A从Object继承的,运行时期的实例是B类,所以输出的是Class B
  5. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
黄奕豪 + 1 赞一个!

查看全部评分

回复 使用道具 举报
我的理解是因为Test继承了Date,而Date继承自Object,所以Test也就有了getClass方法,而在继承中的规则是子继承父后,如果有同名函数而父类中的函数将会被覆盖,则调用时会运行子类中的方法,所以super.getClass方法调用时是调用的Test类中的getClass方法。
回复 使用道具 举报
本帖最后由 丁二跃 于 2012-6-22 00:06 编辑
  1. public class K extends KK{

  2.         public static void main(String[] args) {
  3.                
  4.                 new K().test();
  5.                
  6.         }
  7.         void test(){
  8.                 super.get();//super 是子类调用父类的方法,而不是通过父类去掉用,在这里通过super调用父类get方法,在父类里打印当前对象就可以一目了然,究竟是那个对象调用的。
  9.                
  10.         }

  11. }

  12. class KK{
  13.    void get(){
  14.            System.out.println("father-----"+this);
  15.    }
  16. }
复制代码
实验结果:father-----K@152b6651

可以看出,是k 也就是子类对象调用
回复 使用道具 举报
在test方法中调用super.getClass().getName()方法等效于调用getClass().getName()方法,都是在调用从父类继承的 getClass()方法,所以super.getClass().getName()方法返回的也应该是Test,
回复 使用道具 举报
朱志辉 发表于 2012-6-21 23:39
由于getClass()在Object类中定义成了final,子类不能覆盖该方法,所以,在test方法中调用super.getClass(). ...

果然是,谢谢了。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马