類名.class 類名.this 詳解

咱們知道在java中,一個類在被加載的時候虛擬機就會自動的生成一個這個類的一個Class類型的「類對象」,每一個類都對應着一個這樣的類對象,經過這個Class類型的類對象,咱們就可以使用「內省與反射」機制,訪問一個類的信息,好比:對應類中的方法有哪些,成員域有哪些等等;獲取一個類的「類對象」的方法之一就是經過使用   類名.class  這個方式返回一個Class類型的對象,其餘的獲取這個Class對象的方法以下:java

1). 利用對象調用getClass()方法獲取該對象的Class實例
2). 使用Class的靜態方法forName(),用類的名字獲取一個Class實例
3). 運用.calss的方式獲取Class實例,對基本數據類型的封裝類,還能夠採用.TYPE來獲取對應的基本數據類型的Class實例。ide

如下是TestClass.java代碼:this

 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    
46 class Point {   
47     static {   
48         System.out.println("loading point");   
49     }   
50    
51     void output() {   
52         System.out.println("x=" + x + ",y=" + y);   
53     }   
54     int x, y;   
55 }   
56    
57 class Line {   
58     static {   
59         System.out.println("loading Line");   
60     }   
61 }

 

 

類名.this spa

  這個語法的應用主要有兩個方面:code

①當在一個類的內部類中,若是須要訪問外部類的方法或者成員域的時候,若是使用  this.成員域(與 內部類.this.成員域 沒有分別) 調用的顯然是內部類的域 , 若是咱們想要訪問外部類的域的時候,就要必須使用  外部類.this.成員域對象

 
 1 public class TestA 
 2 {    
 3     public void tn()
 4     {          
 5         System.out.println("外部類tn");         
 6     }  
 7     Thread thread = new Thread(){     
 8           public void tn(){System.out.println("inner tn");}        
 9           public void run(){           
10                  System.out.println("內部類run");        
11                  TestA.this.tn();//調用外部類的tn方法。          
12                  this.tn();//調用內部類的tn方法           
13              }    
14      };          
15      public static void main(String aaa[])
16      {new TestA().thread.start();}
17 }

②還有一個使用狀況,那就是在是使用意圖更加的清楚,在Android開發中咱們常常要在一些地方使用 Context 類型的參數, 而這個參數咱們每每使用this,
其實這裏面其實有一種隱含的邏輯,好比咱們定義一個Intent 或者一個TextView
 1 public class MainActivity extends Activity {  
 2   
 3                      @Override     
 4   
 5                       protected void onCreate(Bundle savedInstanceState) {      
 6   
 7                             super.onCreate(savedInstanceState);      
 8   
 9                             setContentView(R.layout.activity_main);      
10   
11                             Intent intent = new Intent(MainActivity.this , OtherActivity.class) ;    
12   
13                   }  
14   
15 } 

 

 

這說明咱們建立的Intent 對象是與MainActivity這個類型的對象是有關聯的,也就是說這個Intent是由MainActivity對象發出的,blog

好了,  這說明有些狀況下雖然使用 類名.this  和 直接使用this 沒有分別,可是使用  類名.this  卻可以清楚的顯示出一種關聯性,所以值得提倡內存

與此同時若是咱們建立的Intent在一個匿名內部類中建立的話,可是咱們想讓這個在Intent對象在邏輯上和外部類對象關聯起來的話,咱們就必須使用  外部類名.this  了開發

 

 1 public class MainActivity extends Activity {  
 2   
 3     private Button button;  
 4   
 5     @Override       
 6   
 7      public void onCreate(Bundle savedInstanceState) {           
 8   
 9           super.onCreate(savedInstanceState);           
10   
11           setContentView(R.layout.main);  
12   
13         this.button = (Button) this.findViewById(R.id.Button01);           
14   
15         this.button.setOnClickListener(new OnClickListener() {               
16   
17             @Override               
18   
19             public void onClick(View v) {                   
20   
21                       Intent intent = new Intent();                   
22   
23                       intent.setClass(MainActivity.this, NextActivity.class);                   
24   
25                      startActivity(intent);               
26   
27                }           
28   
29        });       
30   
31    }   
32   
33 }  
相關文章
相關標籤/搜索