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