Customer.class
和cust.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);
}
}
答案 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:如果低估,请告诉我我的错在哪里。