Object.class / object.getClass()(有什么区别)

时间:2013-08-12 11:05:40

标签: java

Customer.classcust.getClass() 工作,但cust.class?有什么区别?

public class Customer() {

}


public class Test {

    public Test() {
        Customer cust = new Customer();

        test(Customer.class);
        test(cust.getClass());
    }


    public <T> void test(Class<T> clazz) {
        System.out.println(clazz);
    }

}

4 个答案:

答案 0 :(得分:1)

Object.class是Object的“伪静态字段”,它返回指定类的类对象。它基本上生成零代码。

obj.getClass()是Object的虚方法,并返回obj引用中对象的ACTUAL类对象。它生成一个实际的调用来检查和检索类(可能是引用声明的类的子类)。

我不确定obj.class是否会编译,但如果它确实是“编译器混合”,相当于编码Object.class - 通常,当您使用引用代替文字时类名,你得到的等价物就像你编写了引用声明的类名一样。

答案 1 :(得分:0)

构造obj.class根本不会编译,因为.class只适用于类。与String.class类似,对于类的实例,您需要调用getClass()

答案 2 :(得分:0)

OP更改后编辑

让我们重做一下这个例子:

public class Test {

    public static void main (String[] args){
        Test t = new Test();
    }

    public Test() {
        Customer customer = new FastFoodCustomer();
        test(Customer.class); 
        test(customer.getClass());
    }


    public <T> void test(Class<T> clazz) {
        System.out.println(clazz);
    }

}

class Customer{

}

class FastFoodCustomer extends Customer{

}

这给出了以下输出:

class Customer
class FastFoodCustomer

getClass()方法继承自Object祖先类。它会告诉你对象是什么类。如果您想知道给定的实例类,则需要调用thatInstance.getClass()方法。如果您致电Customer.class,那么您只会class Customer,因为您询问的是哪个班级Customer。但是对象Customer可以是Customer,但它也可以是它的任何子类(即本例中的FastFoodCustomer)。

您的其他示例cust.class不起作用,因为cust本身没有任何class属性,也没有继承。

答案 3 :(得分:-1)

Object class引用了一个类,但obj仅引用了一个实例,因此您应该使用方法obj.getClass()

PS:如果低估,请告诉我我的错在哪里。