黑马程序员技术交流社区
标题:
getCLass小疑问
[打印本页]
作者:
杜鹏云
时间:
2012-9-7 15:01
标题:
getCLass小疑问
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?
}
}
作者:
陈莹
时间:
2012-9-7 15:53
本帖最后由 陈莹 于 2012-9-7 16:02 编辑
getClass()是Object中的方法,并且在Object类中定义成了final,public final native Class<?> getClass();
所以子类不能覆盖该方法,那么就是说Object中,Person,Student中的getClass方法都是一样的
并且getClass返回的是表示
此对象运行时类的 Class 对象,
所以不管用this,还是super,返回的都是Student,个人感觉相当于调用的一个方法,不知道正确否?
作者:
武庆东
时间:
2012-9-7 16:07
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:50
本帖最后由 尤洋 于 2012-9-7 16:52 编辑
张老师在面试宝典中讲解过这种情况:
由于getClass()在Object类中定义成了final,子类不能覆盖该方法,所以,调用getClass().getName()方法,其实就是在调用从父类继承的getClass()方法,等效于调用super.getClass().getName()方法,所以,super.getClass().getName()方法返回的也应该是子类的字节码
不过个人觉得张老师在这一段讲的有些模糊,
按我自己写代码试验得出的结论就是:在子类中调用getClass方法的话,无论是直接调用还是this,super调用,得到的都是子类的字节码。
因为子类包含父类的所有类容,子类的字节码内容中 也囊括了父类的字节码。
这一点可以通过代码验证,假如我们非要从子类中获得父类的字节码的话,就必须先通过getClass方法获得子类的字节码,再
通过子类的字节码调用getSuperClass()方法
得到父类的字节码。
当然,父类的字节码并没有和子类的字节码合并,两者依然单独存在。
因为在父类中直接调用getClass方法的话得到的仍然是父类的字节码
作者:
陈振兴
时间:
2012-9-7 18:22
最本质的理解就是java中的4大机制中的封装:(定理)
(1)任何子类的构造方法都会去调用父类的构造方法
(2)任何类都有构造方法,如果程序员自己不定义,则系统会加上一个默认的构造方法。如果定义了,则系统不会加;
(3)任何子类的构造方法的第一行一定是super()或者this();
如果程序员不这样写,则系统会默认的加上super();
this();调用本类其它的构造方法,它出现在构造方法的第一行;
我反射这块还没怎么深入,以封装的定义在来反射到类的字节码上,这就很好理解了。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2