[英]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.