我尝试了解Object.getClass()
方法的功能。什么是Java中的“运行时类”?
documentation表示它“返回对象的运行时类”。这个解释并不能帮助我理解这个术语。
拥有别人一个什么样的“运行时类”是一个简单的介绍,什么getClass()
呢?
我尝试了解Object.getClass()
方法的功能。什么是Java中的“运行时类”?
documentation表示它“返回对象的运行时类”。这个解释并不能帮助我理解这个术语。
拥有别人一个什么样的“运行时类”是一个简单的介绍,什么getClass()
呢?
只要把它理解为“一个包含对象类型的所有元数据的对象”。在该对象中,您可以找到在类中声明的方法,字段,类型层次结构等。 这些信息通常用于使用反射来检查对象/类型或运行方法的代码,而不需要当他们自己被编码时,这个类被定义和编译。
“运行”可以强调,因为类定义可能会随时间而改变,或者对象可以声明为超类,而它实际上是一个声明的子类型的实例。当加载某个类时,就是在该实例中加载的那个信息,它将由getClass()方法返回。
简而言之,当您的代码运行时,VM将以与您在.java文件中键入的“源”形式不同的方式定义类。这些信息当然是在编译后加载的,所有元数据(如上所述)将构成他们称之为“运行时类”的东西。 这只是一个奇特的方式来说“一个对象与程序运行时加载的类有关的所有元数据”
你写的每个类都有很多元数据。该元数据由类名,它的字段,它的方法,它的基类,它实现的接口等组成。
有时您可能需要在运行时从您的代码访问元数据。
为了做到这一点,您可以采取任何对象并调用其getClass()
方法。您将收到一个包含上述元数据的Class
对象。
它的意思是“变量在运行时引用的实例的类”(抱歉,如果这不是更清楚)。
如果你有一个Object
参考,它可能是指一个Object
,一个String
,一个Integer
...你得到的类,而不是Object
。
Object obj1 = new Object();
System.out.println(obj1.getClass()); // java.lang.Object
String obj2 = "";
System.out.println(obj2.getClass()); // java.lang.String
obj1 = obj2;
System.out.println(obj1.getClass()); // java.lang.String, not Object.
对象的类可以在运行时更改。考虑以下示例:
package demo;
public class Main {
public static class A {
public int a=0;
}
public static class B extends A {
public int b=1;
}
public static void main(String[] args) {
Main.A b=new Main.A();
System.out.println(b.getClass().toString());
b=new Main.B();
System.out.println(b.getClass().toString());
}
}
b.getClass()的输出在运行时更改。
它将表示运行时类,而不是引用类。 'Object o = new String()'=>你将得到String,而不是Object。 – Fildor