我嘗試瞭解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