Java-「this」和「類名.this」以及「類名.class」的區分和詳解
- 2020 年 2 月 18 日
- 筆記
引言:
對於以上三個語法結構的區分,需要先理解Class類 所有對象的類以及調用了靜態方法的類都需要在對象創建之前在JVM虛擬機中載入,載入內容被稱為「類對象」,每個類的類對象是唯一且是不可變的。而在對象創建的時候,由於類對象已載入,所以可以添加上類型標籤。
1. Class類介紹:
此類的介紹是為了解釋 類名.class
的含義。
1.1 Class類簡介:
- Class類只有私有的構造方法,所以不能使用new關鍵詞來創建一個Class對象;只有JVM虛擬機可以創建一個類對象,且是在類載入的時候被調用的。
- 運行程式時,Java虛擬機(JVM)首先檢查是否所要載入的類對應的Class對象是否已經載入。如果沒有載入,JVM就會根據類名查找.class文件,並將其Class對象載入。
- 基本的 Java 類型(boolean、byte、char、short、int、long、float 和 double)和關鍵字 void 也都對應一個 Class 對象,和其名字相同的類對象名。
- 每個數組屬於被映射為 Class 對象的一個類,所有具有相同類型和維數的數組都共享該 Class 對象。只不過數組對象的名字比較奇怪
- 一般某個類的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(); }
注意事項:
forNanme()
方法會拋出異常ClassNotFoundException
,所以需要使用try-catch
語句捕獲。forName
方法輸入參數為類名,而不是對象名,並且要完整寫出類路徑,否則會拋出異常
方法3:通過類名.class
返回此類對象(非靜態方法): Class classOfString3=String.class;
介紹完以上三種方法,不僅知道了得到Clas對象的方法,也知道了類名.class是什麼意思了,其就是返回類名所對應的唯一類對象。
1.3 Class類的常用方法:
getName()
其原理上調用了一個本地私有方法的非靜態方法,返回String類型的實例,代表Class 對象所表示的實體(類、介面、數組類、基本類型或 void)名稱。newInstance()
此方法用於返回一個類對象的實例,實例構造只能無參構造器,且為弱類型(即Object類型)。 例子:
try { String s =(String) classOfString.newInstance(); } catch (InstantiationException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); }
可見由於newInstance返回的是Object類型,所以需要額外向下強制轉型。
getClassLoader()
返回該類的類載入器。getComponentType()
返回表示數組組件類型的 Class。getSuperclass()
返回表示此 Class 所表示的實體(類、介面、基本類型或 void)的超類的 Class。isArray()
判定此 Class 對象是否表示一個數組類。
2. this關鍵詞:
this關鍵字的三大應用:
- this調用本類中的屬性,也就是類中的成員變數,例如:set和構造器中經常使用this關鍵字(與輸入方法的輸入參數同名了);
- this調用本類中的其他方法,但通常this可以省略;
- 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 |