類名.class和類名.this的區別
類名.class
我們知道在java中,一個類在被載入的時候虛擬機器就會自動的生成一個這個類的一個Class型別的“類物件”,每個類都對應著一個這樣的類物件,通過這個Class型別的類物件,我們就能夠使用“內省與反射”機制,訪問一個類的資訊,比如:對應類中的方法有哪些,成員域有哪些等等;獲取一個類的“類物件”的方法之一就是通過使用 類名.class 這個方式返回一個Class型別的物件,其他的獲取這個Class物件的方法如下:
1). 利用物件呼叫getClass()方法獲取該物件的Class例項
2). 使用Class的靜態方法forName(),用類的名字獲取一個Class例項
3). 運用.calss的方式獲取Class例項,對基本資料型別的封裝類,還可以採用.TYPE來獲取對應的基本資料型別的Class例項。
以下是TestClass.java程式碼:
- public class TestClass {
- public static void main(String[] args) {
- // 在執行期間,如果我們要產生某個類的物件,java虛擬機器會檢測該型別的Class物件是否已被載入。如果沒有載入,java虛擬機器會根據類的名稱找到.class檔案並載入它。
- //當new Point()的時候載入這個類,用forName構造例項的時候也載入該類。 只加載一次
- System.out.println("before new Point()");
- new Point();
- System.out.println("after new Point()");
- try {
- Class.forName("Line");
- } catch (Exception e) {
- e.printStackTrace();
- }
- // 利用物件呼叫getClass()方法獲取該物件的Class例項
- Point pt = new Point();
- Class c1 = pt.getClass();
- System.out.println(c1.getName()); // 結果:Point
- // 使用Class的靜態方法forName(),用類的名字獲取一個Class例項
- try {
- Class c2 = Class.forName("Point");
- System.out.println(c2.getName()); // 結果:Point
- Point pp = (Point) c2.newInstance(); //一旦某個型別的Class物件已經被載入到記憶體,就可以用它來產生該型別的所有物件。
- //newInstance()呼叫類中預設的構造方法。
- pp.output();
- } catch (Exception e) {
- e.printStackTrace();
- }
- // 運用.class的方式獲取Class例項(類)
- Class c3 = Point.class;
- System.out.println(c3.getName()); // 結果:Point
- // 運用.calss的方式獲取Class例項(基本型別)
- Class c4 = int.class;
- System.out.println(c4.getName()); // 結果:int
- // 運用.class的方式獲取Class例項(基本資料型別的封裝類)
- Class c5 = Integer.TYPE;
- System.out.println(c5.getName()); // 結果:int
- Class c6 = Integer.class;
- System.out.println(c6.getName()); // 結果:java.lang.Integer
- }
- }
- class Point {
- static {
- System.out.println("loading point");
- }
- void output() {
- System.out.println("x=" + x + ",y=" + y);
- }
- int x, y;
- }
- class Line {
- static {
- System.out.println("loading Line");
- }
- }
類名.this
這個語法的應用主要有兩個方面:
①當在一個類的內部類中,如果需要訪問外部類的方法或者成員域的時候,如果使用 this.成員域(與 內部類.this.成員域 沒有分別) 呼叫的顯然是內部類的域 , 如果我們想要訪問外部類的域的時候,就要必須使用 外部類.this.成員域
package com.test;
public class TestA
{
public void tn()
{
System.out.println("外部類tn");
}
Thread thread = new Thread(){
public void tn(){System.out.println("inner tn");}
public void run(){
System.out.println("內部類run");
TestA.this.tn();//呼叫外部類的tn方法。
this.tn();//呼叫內部類的tn方法
}
};
public static void main(String aaa[])
{new TestA().thread.start();}
}
②還有一個使用情況,那就是在是使用意圖更加的清楚,在Android開發中我們經常要在一些地方使用 Context 型別的引數, 而這個引數我們往往使用this
其實這裡面其實有一種隱含的邏輯,比如我們定義一個Intent 或者一個TextView ,如
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Intent intent = new Intent(MainActivity.this , OtherActivity.class) ;
}
}
這說明我們建立的Intent 物件是與MainActivity這個型別的物件是有關聯的,也就是說這個Intent是由MainActivity物件發出的,
好了, 這說明有些情況下雖然使用 類名.this 和 直接使用this 沒有分別,但是使用 類名.this 卻能夠清楚的顯示出一種關聯性,因此值得提倡
與此同時如果我們建立的Intent在一個匿名內部類中建立的話,但是我們想讓這個在Intent物件在邏輯上和外部類物件關聯起來的話,我們就必須使用 外部類名.this 了
public class MainActivity extends Activity {
private Button button;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
this.button = (Button) this.findViewById(R.id.Button01);
this.button.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent();
intent.setClass(MainActivity.this, NextActivity.class);
startActivity(intent);
}
});
}
}