黑马程序员技术交流社区

标题: 一段代码引出的final方法特别之处! [打印本页]

作者: 最初的理想    时间: 2012-2-7 18:40
标题: 一段代码引出的final方法特别之处!
本帖最后由 最初的理想 于 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
作者: 王文龙    时间: 2012-2-7 19:40
我认为是这样的:
从文档中得,
getClass()方法返回值为:返回Object运行时的类名.

不管是getClass()还是super.getClass(),
此时调用两个方法的对象都是Test类的实例对象,
此时运行的类是Test,
所以返回Test.
作者: 李泽霖    时间: 2012-2-7 20:19
将方法声明为final,那就说明你已经知道这个方法提供的功能已经满足你要求,不需要进行扩展,并且也不允许任何从此类继承的类来覆写这个方法,但是继承仍然可以继承这个方法,也就是说可以直接使用。getclass()为final的,任何类可以直接使用,在
test方法中调用getClass().getName()方法,其实就是在调用从父类继承的getClass()方法,等价于调用super.getClass().getName()方法,所以为test,个人总结观点
作者: 最初的理想    时间: 2012-2-7 20:30
王文龙 发表于 2012-2-7 19:40
我认为是这样的:
从文档中得,
getClass()方法返回值为:返回Object运行时的类名.

我表达的意思你懂了,你这个说法我比较赞同{:3_47:}
作者: 尹旗龙    时间: 2012-2-8 19:17
这个不是final特殊用法问题,而是getclass特性,或者说是Java特性问题,如果换了上帝里别的final方法,那么在子类里用super调用这个final方法就应该返回父类调用final方法得到的结果了。
感觉这个问题问的很好啊,长知识了,上帝忒重要了,看来有必要好好研究下




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2