什么是"运行时类"在Java?

时间:2016-11-08 12:15:21

标签: java oop

我尝试了解Object.getClass()方法的作用。

documentation表示它"返回对象的运行时类。"这个解释并不能帮助我理解这个术语。

有人简单描述"运行时类"是getClass()是什么?

4 个答案:

答案 0 :(得分:5)

它表示"变量在运行时引用的实例的类" (对不起,如果那不是真的更清楚)。

如果您引用Object,则可以引用ObjectStringInteger ...您获得该类,而不是{ {1}}。

Object

答案 1 :(得分:4)

您编写的每个课程都有很多元数据。该元数据由类名,其字段,方法,基类,它实现的接口等组成。

有时您可能需要在运行时从代码中访问该元数据。

为此,您可以使用任何对象并调用其getClass()方法。您将收到一个包含上述元数据的Class对象。

答案 2 :(得分:2)

将其理解为“具有对象类型的所有元数据的对象”。在该对象中,您可以找到在类中声明的方法,字段,类型层次结构等。 此信息通常由代码使用,该代码使用反射来检查对象/类型或运行方法,而无需在编码时自定义和编译类。

“Runtime”可能会被强调,因为类定义可能会随着时间的推移而改变,或者对象可能被声明为超类型,而它实际上是声明的类型的子类型的实例。当加载某个类时,它就是在该实例中加载的信息,它将由getClass()方法返回。

简而言之,当您的代码运行时,VM将以与您在.java文件中键入的“源”表单不同的方式定义您的类。当然,在编译之后,该信息将被加载,并且所有元数据(如上所述)将构成他们称之为“运行时类”的信息。 这只是一种奇特的方式,可以说“一个对象,其中包含有关在程序运行时加载的类的所有元数据”

答案 3 :(得分: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()的输出在运行时发生了变化。