调用MyClass.class和MyClass.getClass()之间有什么区别
MyClass.class
和MyClass.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