Java-「this」和「類名.this」以及「類名.class」的區分和詳解

  • 2020 年 2 月 18 日
  • 筆記

引言:

對於以上三個語法結構的區分,需要先理解Class類 所有對象的類以及調用了靜態方法的類都需要在對象創建之前在JVM虛擬機中載入,載入內容被稱為「類對象」,每個類的類對象是唯一且是不可變的。而在對象創建的時候,由於類對象已載入,所以可以添加上類型標籤。


1. Class類介紹:

此類的介紹是為了解釋 類名.class的含義。

1.1 Class類簡介:

  1. Class類只有私有的構造方法,所以不能使用new關鍵詞來創建一個Class對象;只有JVM虛擬機可以創建一個類對象,且是在類載入的時候被調用的。
  2. 運行程式時,Java虛擬機(JVM)首先檢查是否所要載入的類對應的Class對象是否已經載入。如果沒有載入,JVM就會根據類名查找.class文件,並將其Class對象載入。
  3. 基本的 Java 類型(boolean、byte、char、short、int、long、float 和 double)和關鍵字 void 也都對應一個 Class 對象,和其名字相同的類對象名。
  4. 每個數組屬於被映射為 Class 對象的一個類,所有具有相同類型維數的數組都共享該 Class 對象。只不過數組對象的名字比較奇怪
  5. 一般某個類的Class對象被載入記憶體,它就用來創建這個類的所有對象。

1.2 得到類對象的三個方法:

雖然我們不能使用構造器得到Class對象,但是卻可以通過其他方法得到:(注意,class對象可以是介面) 我們先創建一個對象,比如: String類: String str = new String("Hello World");

方法1:通過 對象.getClass()得到對象類(非靜態方法): Class classOfString=str.getClass();

注意事項:getClass方法繼承於Object類,是一個native方法

方法2:通過Class類的靜態方法forName()返回類對象:

        try {              Class classOfString2=Class.forName("java.lang.String");              System.out.println(classOfString2);          } catch (ClassNotFoundException e) {              e.printStackTrace();          }

注意事項:

  1. forNanme()方法會拋出異常ClassNotFoundException,所以需要使用try-catch語句捕獲。
  2. forName方法輸入參數為類名,而不是對象名,並且要完整寫出類路徑,否則會拋出異常

方法3:通過類名.class返回此類對象(非靜態方法): Class classOfString3=String.class;

介紹完以上三種方法,不僅知道了得到Clas對象的方法,也知道了類名.class是什麼意思了,其就是返回類名所對應的唯一類對象。


1.3 Class類的常用方法:

  1. getName() 其原理上調用了一個本地私有方法的非靜態方法,返回String類型的實例,代表Class 對象所表示的實體(類、介面、數組類、基本類型或 void)名稱。
  2. newInstance() 此方法用於返回一個類對象的實例,實例構造只能無參構造器,且為弱類型(即Object類型)。 例子:
	try {              	String s =(String) classOfString.newInstance();          } 	catch (InstantiationException e) {              	e.printStackTrace();          	} 	catch (IllegalAccessException e) {              	e.printStackTrace();          }

可見由於newInstance返回的是Object類型,所以需要額外向下強制轉型。

  1. getClassLoader() 返回該類的類載入器。
  2. getComponentType() 返回表示數組組件類型的 Class。
  3. getSuperclass() 返回表示此 Class 所表示的實體(類、介面、基本類型或 void)的超類的 Class。
  4. isArray() 判定此 Class 對象是否表示一個數組類。

2. this關鍵詞:

this關鍵字的三大應用:

  1. this調用本類中的屬性,也就是類中的成員變數,例如:set和構造器中經常使用this關鍵字(與輸入方法的輸入參數同名了);
  2. this調用本類中的其他方法,但通常this可以省略;
  3. this調用本類中的其他構造方法,調用時要放在構造方法的首行,this()方法可以為有參,也可以為無參(重載)。

總之,關鍵字this用於指代當前的對象。因此,類內部可以使用this作為前綴引用實例域以及方法(包括構造方法);


3. 類名.this :

類名.this一般用於內部類調用外部類的對象時使用,因為內部類使用this.調用的是內部類的域和方法,為了加以區別,所以使用類名.this來加以區分。例如以下程式碼:

class OuterClass {      final String str = "OuterClass";      private InnerClass innerClass;        public InnerClass getInner() {          innerClass = new InnerClass();          return innerClass;        }        class InnerClass {          final String str = "InnerClass";          final String str2 = this.str;//指向內部類的域          final String str3 = OuterClass.this.str;//指向外部類的域      }        public static void main(String[] args) {          OuterClass outerClass = new OuterClass();          InnerClass innerClass = outerClass.getInner();          System.out.println(innerClass.str);          System.out.println(innerClass.str2);          System.out.println(innerClass.str3);      }    }

控制台輸出:

InnerClass  InnerClass  OuterClass

4.總結

組合

用法說明

this

指代當前對象的引用

類名.class

指向每個類對應的唯一類對象(類型為Class)

類名.this

內部(可以是匿名內部類)類調用外部類的對象時使用,即在內部類中使用時:外部類對象是外部類名.this,內部類對象則是this