黑马程序员技术交流社区

标题: 求打印结果 [打印本页]

作者: 徐升兴    时间: 2012-10-25 23:52
标题: 求打印结果
本帖最后由 徐升兴 于 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?说详细点啊,反应老慢了。

作者: 新立    时间: 2012-10-26 00:06
在test方法中,直接调用getClass().getName()方法,返回的是Test类名
由于getClass()在Object类中定义成了final,子类不能覆盖该方法,所以,在
test方法中调用getClass().getName()方法,其实就是在调用从父类继承的getClass()方法,等效于调用super.getClass().getName()方法,所以,super.getClass().getName()方法返回的也应该是Test。
如果想得到父类的名称,应该用如下代码:
getClass().getSuperClass().getName();

作者: 李连闯    时间: 2012-10-26 00:38
本帖最后由 李连闯 于 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
}         




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