基于Java class對象說明、Java 靜態(tài)變量聲明和賦值說明(詳解)
先看下JDK中的說明:
java.lang.Object java.lang.Class<T> Instances of the class Class represent classes and interfaces in a running Java application. An enum is a kind of class and an annotation is a kind of interface. Every array also belongs to a class that is reflected as a Class object that is shared by all arrays with the same element type and number of dimensions. The primitive Java types (boolean, byte, char, short, int, long, float, and double), and the keyword void are also represented as Class objects. Class has no public constructor. Instead Class objects are constructed automatically by the Java Virtual Machine as classes are loaded and by calls to the defineClass method in the class loader. The following example uses a Class object to print the class name of an object: void printClassName(Object obj) { System.out.println("The class of " + obj + " is " + obj.getClass().getName()); } It is also possible to get the Class object for a named type (or for void) using a class literal. System.out.println("The name of class Foo is: "+Foo.class.getName()); 在一個運行著的JAVA應用中,類的任何實例都可以用Class對象來指代,Class可以指代所有的類和接口。枚舉屬于類,注解屬于接口,均可以用Class指代。每個數(shù)組均屬于反射的Class對象,數(shù)組中的每個元素和維度也同樣擁有Class對象。Java基本類型(boolean, byte, char, short, int, long, float, and double)以及關(guān)鍵字void也都可以用Class指代。 Class類不存在構(gòu)造函數(shù),當類被加載過程中由JVM通過調(diào)用類加載器中的defineClass方法自動構(gòu)造。 下面的例子是將一個對象通過Class對象打印出類名。 void printClassName(Object obj) { System.out.println("The class of " + obj + " is " + obj.getClass().getName()); } 通過class關(guān)鍵字指定類型也是可以得到Class對象的 System.out.println("The name of class Foo is: "+Foo.class.getName());
上面內(nèi)容總結(jié)下,就是Java中所有的對象以及基本類型都是可以用Class指代的。接下來看一個Demo。
/** * * 旨在測試Class對象和Instance之間的關(guān)系; * 旨在測試靜態(tài)變量的聲明和賦值過程; * @author zzy * */ public class ObjClass { private enum tmpEnum {A, B, C}; public static void main(String[] args){ int[] tmpArray = {1,2,3}; Class classType; try { // 通過類名直接獲取Class對象,JVM中沒有加載。 classType = InClass.class; System.out.println(".class: " + classType); System.out.println(".class finish."); // Java加載類 classType = Class.forName("InClass"); System.out.println("Class.forName: " + classType); System.out.println("Class.forName: finish."); // 創(chuàng)建實例 InClass newClassType = new InClass(); classType = newClassType.getClass(); System.out.println("new Object.getClass: " + classType); System.out.println("new Object.getClass: finish."); // 數(shù)組對象 classType = tmpArray.getClass(); System.out.println("Array.getClass:" + classType.getSimpleName()); System.out.println("Array.getClass: finish."); // 枚舉對象 classType = tmpEnum.class; System.out.println("enum.class:" + classType); System.out.println("enum.class: finish."); } catch (ClassNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } class InClass{ // 對靜態(tài)變量聲明之前賦值 { staticPara = 10; } public static int staticPara; // 構(gòu)造函數(shù) public InClass(){ System.out.println("construction..."); } // 靜態(tài)代碼塊 static { System.out.println("static function..."); } // 靜態(tài)變量賦值 { staticPara = 20; } { System.out.println("normal function, staticPara:" + staticPara); } // 靜態(tài)變量賦值 { staticPara = 30; } }
輸出結(jié)果:
.class: class InClass .class finish. static function... Class.forName: class InClass Class.forName: finish. normal function, staticPara:20 construction... new Object.getClass: class InClass new Object.getClass: finish. Array.getClass:int[] Array.getClass: finish. enum.class:class ObjClass$tmpEnum enum.class: finish.
說明:
1. .class方式獲取類文件的Class對象,并不需要加載JVM中。
2. Class.forName的方式JVM會加載類,同時會編譯。 如此,類中的靜態(tài)代碼塊就會被執(zhí)行。
3. 創(chuàng)建實例過程中(已經(jīng)加載至JVM中,也就是說編譯過了),調(diào)用構(gòu)造函數(shù),并執(zhí)行非靜態(tài)代碼塊。
4. 靜態(tài)代碼對于變量的聲明和賦值順序是沒有影響的(編譯過程處理),所以結(jié)果是20。
5. 數(shù)據(jù)對象和枚舉對象也是可以被Class對象指定的。
以上這篇基于Java class對象說明、Java 靜態(tài)變量聲明和賦值說明(詳解)就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
Java實現(xiàn)后臺發(fā)送及接收json數(shù)據(jù)的方法示例
這篇文章主要介紹了Java實現(xiàn)后臺發(fā)送及接收json數(shù)據(jù)的方法,結(jié)合實例形式分析了java針對json格式數(shù)據(jù)的傳輸與操作相關(guān)技巧,需要的朋友可以參考下2018-12-12SpringCloud-Gateway網(wǎng)關(guān)的使用實例教程
Gateway網(wǎng)關(guān)在微服務架構(gòu)中扮演了不可或缺的角色,通過集中化管理、智能路由和強大的過濾器機制,為構(gòu)建高效、可擴展的微服務系統(tǒng)提供了有力支持,這篇文章主要介紹了SpringCloud-Gateway網(wǎng)關(guān)的使用,需要的朋友可以參考下2024-03-03chatgpt java環(huán)境調(diào)用源碼實現(xiàn)demo
這篇文章主要介紹了chatgpt java環(huán)境調(diào)用源碼實現(xiàn)demo,本文結(jié)合實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2023-02-02spring boot和spring cloud之間的版本關(guān)系
這篇文章主要介紹了spring boot和spring cloud之間的版本關(guān)系,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-08-08淺析打開eclipse出現(xiàn)Incompatible JVM的解決方法
本篇文章是對打開eclipse出現(xiàn)Incompatible JVM的解決方法進行了詳細的分析介紹,需要的朋友參考下2013-07-07IDEA中request.getParameter爆紅問題及解決
這篇文章主要介紹了IDEA中request.getParameter爆紅問題及解決方案,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-11-11java中i=i++和j=i++的區(qū)別小結(jié)
這篇文章主要給大家介紹了關(guān)于java中i=i++和j=i++區(qū)別的相關(guān)資料,文中通過圖文介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2021-04-04