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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 杜鹏云 中级黑马   /  2012-9-7 15:01  /  1635 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

package 反射;
import java.lang.reflect.*;
import java.util.*;
public class Constuctor {

public static void main(String [] args) throws SecurityException, NoSuchMethodException {
  
Student s=new Student();
   
     //输出结果为何是
//class2:反射.Student
        //class1:反射.Student

}
}
class Person{

Person(){
  System.out.println("class2:"+getClass().getName());//
}

}
class Student extends Person{
Student(){
              //这一行默认调用super();
  System.out.println("class1:"+super.getClass().getName());//super和this效果一样,why?
}
}

评分

参与人数 1技术分 +1 收起 理由
创出一片辉煌 + 1 赞一个!

查看全部评分

4 个回复

倒序浏览

回帖奖励 +2

本帖最后由 陈莹 于 2012-9-7 16:02 编辑


getClass()是Object中的方法,并且在Object类中定义成了final,public final native Class<?> getClass();
所以子类不能覆盖该方法,那么就是说Object中,Person,Student中的getClass方法都是一样的
并且getClass返回的是表示此对象运行时类的 Class 对象,所以不管用this,还是super,返回的都是Student,个人感觉相当于调用的一个方法,不知道正确否?
回复 使用道具 举报
package 反射;
import java.lang.reflect.*;
import java.util.*;
public class Constuctor {

public static void main(String [] args) throws SecurityException, NoSuchMethodException {
  
Student s=new Student();
   
     /*输出结果为何是  class2:反射.Student
                                  class1:反射.Student
    反射得到的是Student这个类的字节码,不是对象的字节码!class



*/
}
}
class Person{

Person(){
  System.out.println("class2:"+getClass().getName());//
}

}
class Student extends Person{
Student(){
              //这一行默认调用super(); 它是在子类进行new时创建的对象,所以得到的类的字节码应该是子类的所以得到上面的结果
  System.out.println("class1:"+super.getClass().getName());/*super和this效果一样,why?
解答:s

*/
}
回复 使用道具 举报
本帖最后由 尤洋 于 2012-9-7 16:52 编辑

张老师在面试宝典中讲解过这种情况:
      由于getClass()在Object类中定义成了final,子类不能覆盖该方法,所以,调用getClass().getName()方法,其实就是在调用从父类继承的getClass()方法,等效于调用super.getClass().getName()方法,所以,super.getClass().getName()方法返回的也应该是子类的字节码

不过个人觉得张老师在这一段讲的有些模糊,
按我自己写代码试验得出的结论就是:在子类中调用getClass方法的话,无论是直接调用还是this,super调用,得到的都是子类的字节码。
因为子类包含父类的所有类容,子类的字节码内容中 也囊括了父类的字节码。
这一点可以通过代码验证,假如我们非要从子类中获得父类的字节码的话,就必须先通过getClass方法获得子类的字节码,再通过子类的字节码调用getSuperClass()方法得到父类的字节码。

当然,父类的字节码并没有和子类的字节码合并,两者依然单独存在。
因为在父类中直接调用getClass方法的话得到的仍然是父类的字节码
回复 使用道具 举报
最本质的理解就是java中的4大机制中的封装:(定理)
(1)任何子类的构造方法都会去调用父类的构造方法
(2)任何类都有构造方法,如果程序员自己不定义,则系统会加上一个默认的构造方法。如果定义了,则系统不会加;
(3)任何子类的构造方法的第一行一定是super()或者this();
如果程序员不这样写,则系统会默认的加上super();
this();调用本类其它的构造方法,它出现在构造方法的第一行;
我反射这块还没怎么深入,以封装的定义在来反射到类的字节码上,这就很好理解了。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马