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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 最初的理想 黑马帝   /  2012-2-7 18:40  /  2024 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 最初的理想 于 2012-2-8 21:23 编辑

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());
        }
}
很奇怪,结果是Test   
张老师解释如下:在test方法中,直接调用getClass().getName()方法,返回的是Test类名
由于getClass()在Object类中定义成了final,子类不能覆盖该方法,所以,在
test方法中调用getClass().getName()方法,其实就是在调用从父类继承的getClass()方法,等效于调用super.getClass().getName()方法,所以,super.getClass().getName()方法返回的也应该是Test。
如果想得到父类的名称,应该用如下代码:
getClass().getSuperClass().getName();
可是我还是有点不明白,final虽然不能被重写,但是父类也继承了啊,getclass()返回了自身的字节码,那么super.getclass()就应当返回父类的字节码吧,这里是不是可以看做final方法的一个特别之处。请大家说说自己如何理解的
ps: 求助一个多线程的问题http://bbs.itheima.com/thread-6625-1-2.html

评分

参与人数 1技术分 +1 收起 理由
唐秀启 + 1 赞一个!

查看全部评分

4 个回复

正序浏览
尹旗龙 来自手机 黑马帝 2012-2-8 19:17:11
报纸
这个不是final特殊用法问题,而是getclass特性,或者说是Java特性问题,如果换了上帝里别的final方法,那么在子类里用super调用这个final方法就应该返回父类调用final方法得到的结果了。
感觉这个问题问的很好啊,长知识了,上帝忒重要了,看来有必要好好研究下

评分

参与人数 1技术分 +1 收起 理由
admin + 1

查看全部评分

回复 使用道具 举报
王文龙 发表于 2012-2-7 19:40
我认为是这样的:
从文档中得,
getClass()方法返回值为:返回Object运行时的类名.

我表达的意思你懂了,你这个说法我比较赞同{:3_47:}
回复 使用道具 举报
将方法声明为final,那就说明你已经知道这个方法提供的功能已经满足你要求,不需要进行扩展,并且也不允许任何从此类继承的类来覆写这个方法,但是继承仍然可以继承这个方法,也就是说可以直接使用。getclass()为final的,任何类可以直接使用,在
test方法中调用getClass().getName()方法,其实就是在调用从父类继承的getClass()方法,等价于调用super.getClass().getName()方法,所以为test,个人总结观点

评分

参与人数 1技术分 +1 收起 理由
唐秀启 + 1

查看全部评分

回复 使用道具 举报
我认为是这样的:
从文档中得,
getClass()方法返回值为:返回Object运行时的类名.

不管是getClass()还是super.getClass(),
此时调用两个方法的对象都是Test类的实例对象,
此时运行的类是Test,
所以返回Test.

评分

参与人数 1技术分 +1 收起 理由
唐秀启 + 1

查看全部评分

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