Person per[]= new Person[2];//有一个person类
for(int i=0;i<per.length;i++){
per[i]=new Person("xp"+i,21);
}//实例化
Class c1 =per[1].getClass();
Class c2=Class.forName("Testlist.Person");
Class c3=per[0].getClass();
if(c3==c1){
System.out.println("true");
}
else System.out.println("false");
结果是TRUE。
请问我实例化的时候不是new了三个不同的对象么?那么为什么比较的结果是TRUE呢?
另外,getclass和class.forname我感觉差不多的功能,是不是一回事啊?O(∩_∩)O~
for(int i=0;i<per.length;i++){
per[i]=new Person("xp"+i,21);
}//实例化
Class c1 =per[1].getClass();
Class c2=Class.forName("Testlist.Person");
Class c3=per[0].getClass();
if(c3==c1){
System.out.println("true");
}
else System.out.println("false");
结果是TRUE。
请问我实例化的时候不是new了三个不同的对象么?那么为什么比较的结果是TRUE呢?
另外,getclass和class.forname我感觉差不多的功能,是不是一回事啊?O(∩_∩)O~
解决方案 »
- java 如何判断txt的编码字符集
- 又被入门问题难住了。找不到类!!
- Scanner输入问题
- JButton中的ActionCommand??????
- 初次运行java小程序,编译通过,但是运行时出现NoSuchMethodError错误,哪位老兄帮忙给调试一下?
- 大哥,大虾,大姐们,小妹又有问题跪求大家帮忙了。很急.谢谢大家.
- 大家经常用output.flush()吧 你知不知道flush()方法竟然是个空方法
- 怎样一次读取不定长度的InputStream? 非要指定一个固定缓冲吗?
- 一个初级问题,关于对像的引用(对像变量的赋值)
- 求小问题的解决方法,高手来看看~!
- 如何用 setIconImage方法!
- 新手:帮忙看看这个将字符串逆序的方法有什么问题
System.out.println(c2.getClass().getName());输出的是java.lang.Class就是那个相同的类的对象吧?O(∩_∩)O~
getClass和forName是Class类的两个方法,
getClass返回的是Class类型的实例,
同一种Class类型返回的实例当然是一样的,
froName方法获得的是类名对应的Class对象,
同一Class类型返回的实例也是一样的,
并且同一个类的Class类型通过getClass和forName方法获得的Class对象都是相同的。
还有一种方法可以获得Class对象,就是类名.class,
这是三种不同的获得Class对象的方法,同意Class类型获得的Class对象是一样的
class Class<T> implements java.io.Serializable,
java.lang.reflect.GenericDeclaration,
java.lang.reflect.Type,
java.lang.reflect.AnnotatedElement {
.....
}看看源码去吧
Class c2=Class.forName("Testlist.Person");
Class c3=per[0].getClass();
我有疑问
Class是一个类,=后面返回一个对象,那c1、c2、c3就是指向这些对象的引用了,既然是引用,比较时,应该比较的是引用的地址,怎么会相等呢
每个类都有一个Class对象,而且只有一个,也就是编译了类后的同名的.class对象,我们new一个类的对象时,jvm虚拟机会加载这个.class对象,在这个类的字节码被加载时,他们会接受验证,以保证其没有被破坏,一旦这个类的Class对象被载入内存,就会用这个Class对象来新建一个类的对象
所以
Class c1 =per[1].getClass();
Class c2=Class.forName("Testlist.Person");
Class c3=per[0].getClass();
这三句c1、c2、c3指向同一个对象,即Class对象
public Class<?> loadClass(String name)如果你从类加载器里面删除它,在加载一次,结果就不一样了,或者你自定义一个类加载器(继承ClassLoader),在加载该类,再取出Class对象比较,结果肯定是flase。指定一个类加载器里面取出Class对象的方法如下:
Class.forName(String name, boolean initialize, ClassLoader loader)
你若想验证这三块板砖是否是同一个东西,应该直接用per[0] == per[1]这样的判断语句,而不是判断它们的getClass返回值。