中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

怎么理解JAVA中類、實例與Class對象

發布時間:2021-11-19 16:43:24 來源:億速云 閱讀:202 作者:iii 欄目:編程語言

本篇內容介紹了“怎么理解JAVA中類、實例與Class對象”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!

類是面向對象編程語言的一個重要概念,它是對一項事物的抽象概括,可以包含該事物的一些屬性定義,以及操作屬性的方法。面向對象編程中,我們都是以類來編碼。

實例

簡單理解,就是new,就是對類的實例化,創建這個類對應的實際對象,類只是對事物的描述,而實例化就相當于為這個描述新開辟了一塊內存,可以改變這塊區域里的各種屬性(成員變量),當然,也可以實例化多塊區域,只是不同的對象而已。

Class

注意這里C大寫了,與類概念區分開,在java里,Class是一個實實在在的類,在包 java.lang 下,有這樣一個Class.java文件,它跟我們自己定義的類一樣,是一個實實在在的類,Class對象就是這個Class類的實例了。

在Java里,所有的類的根源都是Object類,而Class也不例外,它是繼承自Object的一個特殊的類,它內部可以記錄類的成員、接口等信息,也就是在Java里,Class是一個用來表示類的類。(o(∩_∩)o 有點繞啊,抓住關鍵一點,Class是一個實實在在的類,可以為它創建實例,也就是本文后面提到的Class對象,也看叫做Class實例)。

java提供了下面幾種獲取到類的Class對象的方法:

1) 利用對象實例調用getClass()方法獲取該對象的Class實例;

2) 使用Class類的靜態方法forName("包名+類名"),用類的名字獲取一個Class實例

3)運用 類名.class 的方式來獲取Class實例;

我們知道java世界是運行在JVM之上的,我們編寫的類代碼,在經過編譯器編譯之后,會為每個類生成對應的.class文件,這個就是JVM可以加載執行的字節碼。運行時期間,當我們需要實例化任何一個類時,JVM會首先嘗試看看在內存中是否有這個類,如果有,那么會直接創建類實例;如果沒有,那么就會根據類名去加載這個類,當加載一個類,或者當加載器(class loader)的defineClass()被JVM調用,便會為這個類產生一個Class對象(一個Class類的實例),用來表達這個類,該類的所有實例都共同擁有著這個Class對象,而且是唯一的。

總結

在java里,類只是信息描述的,寫明了有哪些內部屬性及接口,你可以理解為是定義了一套規則;而Class對象在java里被用來對類的情況進行表述的一個實例,也就是是類的實際表征,可以理解為是對規則的圖表化,這樣JVM才能直觀的看懂,可以看做是一個模版;而類的實例化對象,就是通過模版,開辟出的一塊內存進行實際的使用。

例子:

我們通過一個例子來理解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

執行:

java Test

代碼中使用了static靜態代碼塊來進行實驗,一個類的運行,JVM做會以下幾件事情 1、類裝載 2、鏈接 3、初始化 4、實例化;而初始化階段做的事情是初始化靜態變量和執行靜態方法等的工作,而且永遠只執行一次。

輸出結果:

Test Class loadedentern Test main()mClassPointClass = class com.dxjia.sample.NameName Class Loaded! count = [1]mClassForName = class com.dxjia.sample.NameName Constructor called!mClassObjectPointClass1 = class com.dxjia.sample.Namedefined one Name objectName Constructor called!Name object instance done!all the Class object equal...

通過結果可以看出在使用 類名.class獲得Class實例時,并不會觸發類的初始化,而 Class.forName方法就會觸發,當然實例化對象肯定也是會觸發的,但因為static代碼塊只執行一次,所以不會再有打印,最后的打印,說明一個類的Class實例只有唯一的一個。

“怎么理解JAVA中類、實例與Class對象”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

安图县| 汕头市| 蒙阴县| 甘泉县| 新源县| 绥德县| 高要市| 通榆县| 平度市| 通渭县| 丹阳市| 咸阳市| 安溪县| 阳朔县| 苏尼特右旗| 綦江县| 运城市| 安阳市| 怀集县| 雅安市| 盐边县| 德格县| 安康市| 读书| 景德镇市| 罗源县| 亳州市| 诸城市| 丰城市| 青岛市| 玉田县| 隆昌县| 青田县| 黔东| 西吉县| 呈贡县| 英德市| 灌云县| 东乡| 信阳市| 南和县|