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~

解决方案 »

  1.   

    你的person是怎么样一个类,而且你问的问题本身就有问题,仔细看一下一些实例,与君共勉!!!
      

  2.   

    class.forname是通过relection API建立类的对象。和通过建立类的实例而建立的类的对象不同。
      

  3.   

    感觉这个跟person类没什么大关系吧,就是一个姓名,一个年龄两个参数。
      

  4.   

    听着虽然有点晕,不过是感觉这么个理
    System.out.println(c2.getClass().getName());输出的是java.lang.Class就是那个相同的类的对象吧?O(∩_∩)O~
      

  5.   

    这个涉及到反射的知识,
    getClass和forName是Class类的两个方法,
    getClass返回的是Class类型的实例,
    同一种Class类型返回的实例当然是一样的,
    froName方法获得的是类名对应的Class对象,
    同一Class类型返回的实例也是一样的,
    并且同一个类的Class类型通过getClass和forName方法获得的Class对象都是相同的。
    还有一种方法可以获得Class对象,就是类名.class,
    这是三种不同的获得Class对象的方法,同意Class类型获得的Class对象是一样的
      

  6.   

    Class 本身也是一个类public final
        class Class<T> implements java.io.Serializable, 
          java.lang.reflect.GenericDeclaration, 
          java.lang.reflect.Type,
                                  java.lang.reflect.AnnotatedElement {
    .....
    }看看源码去吧
      

  7.   

    Class c1 =per[1].getClass();
    Class c2=Class.forName("Testlist.Person");
    Class c3=per[0].getClass();
    我有疑问
    Class是一个类,=后面返回一个对象,那c1、c2、c3就是指向这些对象的引用了,既然是引用,比较时,应该比较的是引用的地址,怎么会相等呢
      

  8.   

    Class对象虽然是对象,但它是一个"特殊"的对象,Class对象是用来创建类的所有的"常规"对象的,也就是用来创建对象的
    每个类都有一个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对象
      

  9.   

    类加载器在加载类的时候,明显只加载一次,所以该类加载器就只有该类的一个Class对象,即是单例
    public Class<?> loadClass(String name)如果你从类加载器里面删除它,在加载一次,结果就不一样了,或者你自定义一个类加载器(继承ClassLoader),在加载该类,再取出Class对象比较,结果肯定是flase。指定一个类加载器里面取出Class对象的方法如下:
    Class.forName(String name, boolean initialize, ClassLoader loader)
      

  10.   

    就比如你用同一个模子做了三块板砖,你问这三块板砖:你的模子是哪个?它们的回答肯定都是那个模子。
    你若想验证这三块板砖是否是同一个东西,应该直接用per[0] == per[1]这样的判断语句,而不是判断它们的getClass返回值。
      

  11.   

    这段话好熟悉,是TIJ上的吧,刚看到这。
      

  12.   

    o(╯□╰)o,啥叫月经贴啊?这问题每个月都出一次?O(∩_∩)O~