2016-11-08 68 views

回答

1

只要把它理解爲「一個包含對象類型的所有元數據的對象」。在該對象中,您可以找到在類中聲明的方法,字段,類型層次結構等。 這些信息通常用於使用反射來檢查對象/類型或運行方法的代碼,而不需要當他們自己被編碼時,這個類被定義和編譯。

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

簡而言之,當您的代碼運行時,VM將以與您在.java文件中鍵入的「源」形式不同的方式定義類。這些信息當然是在編譯後加載的,所有元數據(如上所述)將構成他們稱之爲「運行時類」的東西。 這只是一個奇特的方式來說「一個對象與程序運行時加載的類有關的所有元數據」

3

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

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

爲了做到這一點,您可以採取任何對象並調用其getClass()方法。您將收到一個包含上述元數據的Class對象。

+0

它將表示運行時類,而不是引用類。 'Object o = new String()'=>你將得到String,而不是Object。 – Fildor

3

它的意思是「變量在運行時引用的實例的類」(抱歉,如果這不是更清楚)。

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

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

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

相關問題