1. 程式人生 > >類名.class和類名.this的區別

類名.class和類名.this的區別


類名.class

我們知道在java中,一個類在被載入的時候虛擬機器就會自動的生成一個這個類的一個Class型別的“類物件”,每個類都對應著一個這樣的類物件,通過這個Class型別的類物件,我們就能夠使用“內省與反射”機制,訪問一個類的資訊,比如:對應類中的方法有哪些,成員域有哪些等等;獲取一個類的“類物件”的方法之一就是通過使用   類名.class  這個方式返回一個Class型別的物件,其他的獲取這個Class物件的方法如下:

1). 利用物件呼叫getClass()方法獲取該物件的Class例項
2). 使用Class的靜態方法forName(),用類的名字獲取一個Class例項
3). 運用.calss的方式獲取Class例項,對基本資料型別的封裝類,還可以採用.TYPE來獲取對應的基本資料型別的Class例項。

以下是TestClass.java程式碼:

    1. public class TestClass { 
    2.     public static void main(String[] args) { 
    3.         // 在執行期間,如果我們要產生某個類的物件,java虛擬機器會檢測該型別的Class物件是否已被載入。如果沒有載入,java虛擬機器會根據類的名稱找到.class檔案並載入它。 
    4.         //當new Point()的時候載入這個類,用forName構造例項的時候也載入該類。 只加載一次 
    5.         System.out.println("before new Point()"); 
    6.         new Point(); 
    7.         System.out.println("after new Point()"); 
    8.         try { 
    9.             Class.forName("Line"); 
    10.         } catch (Exception e) { 
    11.             e.printStackTrace(); 
    12.         } 
    13.         // 利用物件呼叫getClass()方法獲取該物件的Class例項 
    14.         Point pt = new Point(); 
    15.         Class c1 = pt.getClass(); 
    16.         System.out.println(c1.getName()); // 結果:Point 
    17.         // 使用Class的靜態方法forName(),用類的名字獲取一個Class例項 
    18.         try { 
    19.             Class c2 = Class.forName("Point"); 
    20.             System.out.println(c2.getName()); // 結果:Point 
    21.             Point pp = (Point) c2.newInstance(); //一旦某個型別的Class物件已經被載入到記憶體,就可以用它來產生該型別的所有物件。 
    22.                                         //newInstance()呼叫類中預設的構造方法。 
    23.             pp.output(); 
    24.         } catch (Exception e) { 
    25.             e.printStackTrace(); 
    26.         } 
    27.         // 運用.class的方式獲取Class例項(類) 
    28.         Class c3 = Point.class; 
    29.         System.out.println(c3.getName()); // 結果:Point 
    30.         // 運用.calss的方式獲取Class例項(基本型別) 
    31.         Class c4 = int.class; 
    32.         System.out.println(c4.getName()); // 結果:int 
    33.         // 運用.class的方式獲取Class例項(基本資料型別的封裝類) 
    34.         Class c5 = Integer.TYPE; 
    35.         System.out.println(c5.getName()); // 結果:int 
    36.         Class c6 = Integer.class; 
    37.         System.out.println(c6.getName()); // 結果:java.lang.Integer 
    38.     } 
    39. class Point { 
    40.     static { 
    41.         System.out.println("loading point"); 
    42.     } 
    43.     void output() { 
    44.         System.out.println("x=" + x + ",y=" + y); 
    45.     } 
    46.     int x, y; 
    47. class Line { 
    48.     static { 
    49.         System.out.println("loading Line"); 
    50.     } 

類名.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);             

               }         

       });     

   } 

}