簡體   English   中英

什么是Java中的“運行時類”?

[英]What is a “runtime class” in Java?

我試着理解Object.getClass()方法的作用。

文檔說它“返回對象的運行時類”。 這個解釋並沒有幫助我理解這個術語。

有人簡單描述了“運行時類”是什么以及getClass()作用是什么?

它表示“變量在運行時引用的實例的類”(對不起,如果實際上並不清楚)。

如果你有一個對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.

您編寫的每個類都有很多元數據。 該元數據由類名,其字段,方法,基類,它實現的接口等組成。

有時您可能需要在運行時從代碼中訪問該元數據。

為此,您可以獲取任何對象並調用其getClass()方法。 您將收到一個包含上述元數據的Class對象。

只需將其理解為“具有對象類型的所有元數據的對象”。 在該對象中,您可以找到在類,字段,類型層次結構等中聲明的方法。此信息通常由使用反射來檢查對象/類型或運行方法的代碼使用,而無需具有當它們本身被編碼時定義和編譯的類。

可以強調“運行時”,因為類定義可能隨時間而變化,或者對象可能被聲明為超類型,而實際上它是所聲明的子類型的子類型的實例。 當加載某個類時,它就是在該實例中加載的信息,它將由getClass()方法返回。

簡而言之,當您的代碼運行時,VM將以與您在.java文件中鍵入的“源”表單不同的方式定義您的類。 當然,在編譯之后,該信息將被加載,並且所有元數據(如上所述)將構成他們稱之為“運行時類”的信息。 這只是一種奇特的方式來說“一個對象,其中包含有關在程序運行時加載的類的所有元數據”

對象的類可以在運行時更改。 考慮以下示例:

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()的輸出在運行時更改。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM