在Java中,“运行时类”是什么?

10

我试图理解Object.getClass()方法所做的事情。

文档称它“返回对象的运行时类”。这个解释并没有帮助我理解这个术语。

有没有人能够简单地描述一下“运行时类”是什么,以及getClass()方法是做什么的?

4个回答

8
只需要理解它是“一个具有对象类型的所有元数据的对象”。在该对象中,您可以找到类声明的方法、字段、类型层次结构等信息。这些信息通常由使用反射来检查对象/类型或在编写代码时不需要定义和编译类就可以运行方法的代码使用。
“Runtime”可能会强调,因为类定义可能随时间而变化,或者对象可能被声明为超类型,而实际上它是所声明的子类型的实例。当加载某个类时,通过getClass()方法返回的是在该实例期间加载的信息。
简而言之,在您的代码运行时,VM将以不同于您在.java文件中键入的“源”形式的方式定义您的类。当然,在编译后,该信息将被加载,并且所有元数据(如上所述)将构成所谓的“运行时类”。它只是一种花哨的说法,“一个在程序运行时加载的关于类的所有元数据的对象”。

6
这意味着“变量在运行时引用的实例类”,如果这不够清晰,那我很抱歉。如果你有一个对于 '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.

4

你编写的每个类都有很多元数据。这些元数据包括类名、字段、方法、基类、实现的接口等。

有时你可能需要在运行时从代码中访问这些元数据。

为了做到这一点,你可以取任何对象并调用它的 getClass() 方法。你将收到一个包含上述元数据的 Class 对象。


而它将代表运行时类,而非引用类。 Object o = new String() => 你将得到字符串,而不是对象。 - Fildor

2

一个对象的类在运行时可以改变。考虑以下示例:

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() 的输出结果发生了变化。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接