调用MyClass.class和MyClass.getClass()之间有什么区别

MyClass.classMyClass.getClass()似乎都返回了java.lang.Class 。 是否有微妙的区别或可以互换使用? 另外, MyClass.class是超类Class类的公共属性吗? (我知道这存在,但似乎无法在javadocs中找到任何提及)

一个是实例方法,因此它返回特定对象的类,另一个是Class常量(即在编译时已知)。

  Class n = Number.class; Number o = 1; o.getClass() // returns Integer.class o = BigDecimal.ZERO; o.getClass(); // returns BigDecimal.class 

这两种情况都返回Class对象的实例,它描述了一个特定的Java类。 对于同一个类,它们返回相同的实例(每个类只有一个Class对象)。

获取Class对象的第三种方法是

 Class n = Class.forName("java.lang.Number"); 

请记住,接口也有Class对象(例如上面的Number)。

另外,MyClass.class是超类Class类的公共属性吗?

它是一种语言关键字。

.getClass()返回对象的运行时类,因此可以在更改变量的类时对其进行修改

另一方面, .class总是返回“类型”的类常量

注意
如果运行时类恰好与TYPE类相同,则两者都相等。 例:

 Long x = new Long(2); Class c1 = Long.class; Class c2 = x.getClass(); //c1==c2 

MyClass没有静态的getClass方法,换句话说,你不能调用MyClass.getClass(),而是需要调用(new MyClass())。getClass()才能使它工作。

getClass()将返回一个MyClass.class对象。 换句话说,MyClass.class是结果对象,而getClass()是一个方法。 在您不知道对象的实际类的情况下,getClass()方法很有用,例如:

public void someMethod(Object o) { if(o.getClass().equals(Set.class)) { // The object is a set } else if(o.getClass().equals(List.class)) { // The object is a List } }
public void someMethod(Object o) { if(o.getClass().equals(Set.class)) { // The object is a set } else if(o.getClass().equals(List.class)) { // The object is a List } } 

请注意,上面的代码示例不是最好的,我只是想说明如何使用它。 使用if(o instanceof Set) { ...}可以实现相同的function

 What's the difference between calling MyClass.class and MyClass.getClass() 

首先你的问题标题有点误导! .getClass() is a method defined in java.lang.Object因此java中的任何对象都可以在类本身调用.class时调用它(如公共静态变量)。 所以问题应该是(坚持java命名约定)

 What's the difference between calling MyClass.class and myClassObject.getClass() 

现在来实际差异

.getClass()是java.lang.Object中的本机java方法。 此方法将返回与调用它的对象的runtime class对应的java.lang.Class对象。 所以

  Test t = new TestSubClass(); Class c2 = t.getClass(); System.out.println(c2); 

将打印class TestSubClass

其中.class将返回静态求值(在编译时已知)类。 它实际上是对应于指向实际对象的引用类型的Class对象

  Test t = new TestSubClass(); Class c2 = Test.class; System.out.println(c2); 

将打印class Test