類名.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.  
    14.         // 利用對象調用getClass()方法獲取該對象的Class實例 
    15.         Point pt = new Point(); 
    16.         Class c1 = pt.getClass(); 
    17.         System.out.println(c1.getName()); // 結果:Point 
    18.  
    19.         // 使用Class的靜態方法forName(),用類的名字獲取一個Class實例 
    20.         try { 
    21.             Class c2 = Class.forName("Point"); 
    22.             System.out.println(c2.getName()); // 結果:Point 
    23.             Point pp = (Point) c2.newInstance(); //一旦某個類型的Class對象已經被加載到內存,就可以用它來產生該類型的所有對象。 
    24.                                         //newInstance()調用類中缺省的構造方法。 
    25.             pp.output(); 
    26.         } catch (Exception e) { 
    27.             e.printStackTrace(); 
    28.         } 
    29.  
    30.         // 運用.class的方式獲取Class實例(類) 
    31.         Class c3 = Point.class; 
    32.         System.out.println(c3.getName()); // 結果:Point 
    33.  
    34.         // 運用.calss的方式獲取Class實例(基本類型) 
    35.         Class c4 = int.class; 
    36.         System.out.println(c4.getName()); // 結果:int 
    37.  
    38.         // 運用.class的方式獲取Class實例(基本數據類型的封裝類) 
    39.         Class c5 = Integer.TYPE; 
    40.         System.out.println(c5.getName()); // 結果:int 
    41.         Class c6 = Integer.class; 
    42.         System.out.println(c6.getName()); // 結果:java.lang.Integer 
    43.     } 
    44.  
    45. class Point { 
    46.     static { 
    47.         System.out.println("loading point"); 
    48.     } 
    49.  
    50.     void output() { 
    51.         System.out.println("x=" + x + ",y=" + y); 
    52.     } 
    53.     int x, y; 
    54.  
    55. class Line { 
    56.     static { 
    57.         System.out.println("loading Line"); 
    58.     } 

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

               }         

       });     

   } 

}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM