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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 徐升兴 中级黑马   /  2012-10-25 23:52  /  1231 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 徐升兴 于 2012-10-28 07:24 编辑

import java.util.Date;

public classTest extends Date{

    public static void main(String[] args) {

       new Test().test();

    }

   

    public void test(){

       System.out.println(super.getClass().getName());

    }

}


为什么打印的结果是Test?说详细点啊,反应老慢了。

评分

参与人数 1技术分 +1 收起 理由
唐志兵 + 1

查看全部评分

2 个回复

倒序浏览
在test方法中,直接调用getClass().getName()方法,返回的是Test类名
由于getClass()在Object类中定义成了final,子类不能覆盖该方法,所以,在
test方法中调用getClass().getName()方法,其实就是在调用从父类继承的getClass()方法,等效于调用super.getClass().getName()方法,所以,super.getClass().getName()方法返回的也应该是Test。
如果想得到父类的名称,应该用如下代码:
getClass().getSuperClass().getName();

评分

参与人数 1技术分 +1 收起 理由
唐志兵 + 1

查看全部评分

回复 使用道具 举报
本帖最后由 李连闯 于 2012-10-26 17:20 编辑

getClass()是Object类中的方法,被final修饰的,不能被子类覆盖的,所以我们平时使用的this.getClass()方法就是从父类Object继承过来的方法,
super.getClass()调用的当让也是Date从Object继承过来的getClass方法,所以这里的this和super调用的都是同一个方法getClass,
很明显在这里,我们知道this.getClass().getName()返回Test,
那么super.getClass().getName()的结果当然也是Test
-----------------------------------------------------------------------
这个东西从侧面印证了一件事情就是,super并不是父类的引用(如果是的话那么super.getClass()获得的就该是父类的字节码而不是子类的了),而只是能够调用的父类的方法和属性而已。super和this均指向当前对象,java的内部机制对二者调用资源时进行了区分,使得一个调用当前类的,一个调用父类的,以前还会把两者平等看待,其实区别还是比较大的,见下面的例子,
public  void test(){
        System.out.println(this);
        System.out.println(super);//syntax error
}         

评分

参与人数 1技术分 +1 收起 理由
唐志兵 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马