0

Customer.class and cust.getClass() work, but cust.class does not? What is the difference?

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

4 回答 4

1

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

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

我不确定是否obj.class会编译,但如果可以编译,它就是相当于编码的“编译器混合” Object.class——通常,当你使用引用代替文字类名时,你会得到与编码相同的结果引用的声明类名。

于 2013-08-12T11:15:08.000 回答
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属性,也没有继承。

于 2013-08-12T11:19:24.480 回答
0

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

于 2013-08-12T11:14:42.583 回答
-1

Object class有一个类的引用,但obj只有一个实例的引用,所以你应该使用该方法obj.getClass()

PS:如果投反对票,请让我知道我的错在哪里。

于 2013-08-12T11:07:55.380 回答