類
大石橋網(wǎng)站建設(shè)公司創(chuàng)新互聯(lián),大石橋網(wǎng)站設(shè)計制作,有大型網(wǎng)站制作公司豐富經(jīng)驗。已為大石橋上千家提供企業(yè)網(wǎng)站建設(shè)服務(wù)。企業(yè)網(wǎng)站搭建\外貿(mào)網(wǎng)站建設(shè)要多少錢,請找那個售后服務(wù)好的大石橋做網(wǎng)站的公司定做!
類是面向?qū)ο缶幊陶Z言的一個重要概念,它是對一項事物的抽象概括,可以包含該事物的一些屬性定義,以及操作屬性的方法。面向?qū)ο缶幊讨校覀兌际且灶悂砭幋a。
實例
簡單理解,就是new,就是對類的實例化,創(chuàng)建這個類對應(yīng)的實際對象,類只是對事物的描述,而實例化就相當于為這個描述新開辟了一塊內(nèi)存,可以改變這塊區(qū)域里的各種屬性(成員變量),當然,也可以實例化多塊區(qū)域,只是不同的對象而已。
Class
注意這里C大寫了,與類概念區(qū)分開,在java里,Class是一個實實在在的類,在包 java.lang 下,有這樣一個Class.java文件,它跟我們自己定義的類一樣,是一個實實在在的類,Class對象就是這個Class類的實例了。
在Java里,所有的類的根源都是Object類,而Class也不例外,它是繼承自O(shè)bject的一個特殊的類,它內(nèi)部可以記錄類的成員、接口等信息,也就是在Java里,Class是一個用來表示類的類。(o(∩_∩)o 有點繞啊,抓住關(guān)鍵一點,Class是一個實實在在的類,可以為它創(chuàng)建實例,也就是本文后面提到的Class對象,也看叫做Class實例)。
java提供了下面幾種獲取到類的Class對象的方法:
1) 利用對象實例調(diào)用getClass()方法獲取該對象的Class實例;
2) 使用Class類的靜態(tài)方法forName("包名+類名"),用類的名字獲取一個Class實例
3)運用 類名.class 的方式來獲取Class實例;
我們知道java世界是運行在JVM之上的,我們編寫的類代碼,在經(jīng)過編譯器編譯之后,會為每個類生成對應(yīng)的.class文件,這個就是JVM可以加載執(zhí)行的字節(jié)碼。運行時期間,當我們需要實例化任何一個類時,JVM會首先嘗試看看在內(nèi)存中是否有這個類,如果有,那么會直接創(chuàng)建類實例;如果沒有,那么就會根據(jù)類名去加載這個類,當加載一個類,或者當加載器(class loader)的defineClass()被JVM調(diào)用,便會為這個類產(chǎn)生一個Class對象(一個Class類的實例),用來表達這個類,該類的所有實例都共同擁有著這個Class對象,而且是唯一的。
總結(jié)
在java里,類只是信息描述的,寫明了有哪些內(nèi)部屬性及接口,你可以理解為是定義了一套規(guī)則;而Class對象在java里被用來對類的情況進行表述的一個實例,也就是是類的實際表征,可以理解為是對規(guī)則的圖表化,這樣JVM才能直觀的看懂,可以看做是一個模版;而類的實例化對象,就是通過模版,開辟出的一塊內(nèi)存進行實際的使用。
例子:
我們通過一個例子來理解Class實例,為了說明方便,我們新建一個包名深點的類。
新建Name.java(當然,該文件要放在com\dxjia\sample的目錄下)
package com.dxjia.sample; public class Name { static int count = 0; static { count++; System.out.println("Name Class Loaded! count = [" + count + "]" ); } public Name() { System.out.println("Name Constructor called!"); } }
再在根目錄新建一個Test主類
import com.dxjia.sample.Name; public class Test { static { Name mName; System.out.println("Test Class loaded"); } public static void main(String[] args) { System.out.println("entern Test main()"); // Name.class Class mClassPointClass; // Class.forName("完整包名+類名") Class mClassForName; // new 對象后,對象.getClass() Class mClassObjectPointClass1; Class mClassObjectPointClass2; try { //測試 類名.class mClassPointClass = Name.class; System.out.println("mClassPointClass = " + mClassPointClass); //測試Class.forName() mClassForName = Class.forName("com.dxjia.sample.Name"); System.out.println("mClassForName = " + mClassForName); //測試Object.getClass() Name name1 = new Name(); mClassObjectPointClass1 = name1.getClass(); System.out.println("mClassObjectPointClass1 = " + mClassObjectPointClass1); } catch (ClassNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); return; } Name name2; System.out.println("defined one Name object"); name2 = new Name(); System.out.println("Name object instance done!"); mClassObjectPointClass2 = name2.getClass(); if (mClassForName == mClassPointClass && mClassPointClass == mClassObjectPointClass1 && mClassObjectPointClass1 == mClassObjectPointClass2) { System.out.println("all the Class object equal..."); } } }
分別對他們進行編譯:
javac com\dxjia\sample\Name.java javac Test.java
執(zhí)行:
java Test
代碼中使用了static靜態(tài)代碼塊來進行實驗,一個類的運行,JVM做會以下幾件事情 1、類裝載 2、鏈接 3、初始化 4、實例化;而初始化階段做的事情是初始化靜態(tài)變量和執(zhí)行靜態(tài)方法等的工作,而且永遠只執(zhí)行一次。
輸出結(jié)果:
Test Class loaded entern Test main() mClassPointClass = class com.dxjia.sample.Name Name Class Loaded! count = [1] mClassForName = class com.dxjia.sample.Name Name Constructor called! mClassObjectPointClass1 = class com.dxjia.sample.Name defined one Name object Name Constructor called! Name object instance done! all the Class object equal...
通過結(jié)果可以看出在使用 類名.class獲得Class實例時,并不會觸發(fā)類的初始化,而 Class.forName方法就會觸發(fā),當然實例化對象肯定也是會觸發(fā)的,但因為static代碼塊只執(zhí)行一次,所以不會再有打印,最后的打印,說明一個類的Class實例只有唯一的一個。
以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持創(chuàng)新互聯(lián)。
網(wǎng)頁名稱:簡單了解JAVA中類、實例與Class對象
文章轉(zhuǎn)載:http://muchs.cn/article6/gddsog.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供、網(wǎng)站排名、網(wǎng)站導航、搜索引擎優(yōu)化、企業(yè)建站、做網(wǎng)站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)