程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> JAVA綜合教程 >> java中Class對象詳解和類名.class, class.forName(), getClass()區別,.classgetclass

java中Class對象詳解和類名.class, class.forName(), getClass()區別,.classgetclass

編輯:JAVA綜合教程

java中Class對象詳解和類名.class, class.forName(), getClass()區別,.classgetclass


Class對象的生成方式如下:

 

1.類名.class           說明: JVM將使用類裝載器, 將類裝入內存(前提是:類還沒有裝入內存),不做類的初始化工作.返回Class的對象

 

2.Class.forName("類名字符串")  (注:類名字符串是包名+類名)  說明:裝入類,並做類的靜態初始化,返回Class的對象

 

3.實例對象.getClass()  說明:對類進行靜態初始化、非靜態初始化;返回引用運行時真正所指的對象(因為:子對象的引用可能會賦給父對象的引用變量中)所屬的類的Class的對象

 

通過下面的程序,來觀察一下Class對象的生成的原理。

 

[java] view plain copy
  • package ClassTest;  
  •   
  • public class TestClass {  
  •     public static void main(String[] args) {  
  •   
  •         try {  
  •             // 測試.class  
  •             @SuppressWarnings("rawtypes")  
  •             Class testTypeClass = TestClassType.class;  
  •             System.out.println("testTypeClass---" + testTypeClass);  
  •   
  •             // 測試Class.forName()  
  •             @SuppressWarnings("rawtypes")  
  •             Class testTypeForName = Class.forName("ClassTest.TestClassType");  
  •             System.out.println("testTypeForName---" + testTypeForName);  
  •   
  •             // 測試Object.getClass()  
  •             TestClassType testTypeGetClass = new TestClassType();  
  •             System.out.println("testTypeGetClass---"  
  •                     + testTypeGetClass.getClass());  
  •   
  •         } catch (ClassNotFoundException e) {  
  •             // TODO Auto-generated catch block  
  •             e.printStackTrace();  
  •         }  
  •     }  
  •   
  • }  

  • [java] view plain copy
  • package ClassTest;  
  •   
  • public class  TestClassType {  
  •   
  •     // 構造函數  
  •     public TestClassType() {  
  •         System.out.println("----構造函數---");  
  •     }  
  •   
  •     // 靜態的參數初始化  
  •     static {  
  •         System.out.println("---靜態的參數初始化---");  
  •     }  
  •   
  •     // 非靜態的參數初始化  
  •     {  
  •         System.out.println("----非靜態的參數初始化---");  
  •     }  
  •   
  • }  


  •  運行結果如下

    [java] view plain copy
  • testTypeClass---class ClassTest.TestClassType  
  • ---靜態的參數初始化---  
  • testTypeForName---class ClassTest.TestClassType  
  • ----非靜態的參數初始化---  
  • ----構造函數---  
  • testTypeGetClass---class ClassTest.TestClassType  
  •  

    根據結果可以發現,三種生成的Class對象一樣的。並且程序只打印一次“靜態的參數初始化”。 

     

    我們知道,靜態的方法屬性初始化,是在加載類的時候初始化。而非靜態方法屬性初始化,是new類實例對象的時候加載。

     

    因此,這段程序說明,三種方式生成Class對象,其實只有一個Class對象。在生成Class對象的時候,首先判斷內存中是否已經加載。

     

    所以,生成Class對象的過程其實是如此的:

     

    當我們編寫一個新的java類時,JVM就會幫我們編譯成class對象,存放在同名的.class文件中。在運行時,當需要生成這個類的對 象,JVM就會檢查此類是否已經裝載內存中。若是沒有裝載,則把.class文件裝入到內存中。若是裝載,則根據class文件生成實例對象。

    1. 上一頁:
    2. 下一頁:
    Copyright © 程式師世界 All Rights Reserved