1. 程式人生 > 實用技巧 >java中this關鍵字的使用

java中this關鍵字的使用

參考連結:https://www.cnblogs.com/zheting/p/7751752.html

一個物件建立後會有一個this指標指向它。所以this只能在類中的非靜態方法中使用,靜態方法和靜態的程式碼塊中絕對不能出現this,並且this只和特定的物件關聯,而不和類關聯,同一個類的不同物件有不同的this。

一、 使用this來區分當前物件。
Java中為解決變數的命名衝突和不確定性問題,引入關鍵字this代表其所在方法的當前物件的引用:
1) 構造方法中指該構造器所建立的新物件;
2) 方法中指呼叫該方法的物件;
3) 在類本身的方法或構造器中引用該類的例項變數(全域性變數)和方法。
this只能用在構造器或者方法中,用於獲得呼叫當前的構造器方法的物件引用。可以和任何的物件引用一樣來處理這個this物件。

說明:
(1)當例項變數和區域性變數重名,JAVA平臺會按照先區域性變數、後例項變數的順序尋找。即,方法中使用到的變數的尋找規律是先找區域性變數,再找例項變數。如果沒用找到,將會有一個編譯錯誤而無法通過編譯。
(2)如果使用this.a,則不會在方法(區域性變數)中尋找變數a,而是直接去例項變數中去尋找,如果尋找不到,則會有一個編譯錯誤。
(3)在一個方法內,如果沒有出現區域性變數和例項變數重名的情況下,是否使用this關鍵字是沒有區別的。
(4)在同一個類中,Java普通方法的互相呼叫可以省略this+點號,而直接使用方法名+引數。因為Java編譯器會幫我們加上。

public class dududu {
    
/* 因為xx是一個動態的內部類,建立這樣的物件必須有例項與之對應,程式是在靜態方法中直接呼叫動態內部類會報這樣錯誤。 這樣的錯誤好比類中的靜態方法不能直接呼叫動態方法。可以把該內部類宣告為static。或者不要在靜態方法中呼叫。 */ public static class desktop{ public int h=10,w=10; public desktop(int h,int w) { System.out.println("這是物件的h屬性:"+this.h); System.out.println(
"這是物件的w屬性:"+this.w); System.out.println("這是引數h的值:"+h); System.out.println("這是引數w的值:"+w); this.h=h; this.w=w; } public void show() { int h=33,w=44; System.out.println("我的高為:"+this.h+",寬為:"+this.w); } } public static void main(String[] args) { // TODO Auto-generated method stub desktop a = new desktop(1,2); desktop b = new desktop(10,20); a.show(); b.show(); } }

二、建構函式中使用this呼叫其他建構函式

在構造器中可以通過this()方式來呼叫其他的構造器。但在一個構造器中最多隻能呼叫一個其他的構造器。並且,對其他構造器的呼叫動作必須放在構造器的起始處(也就是構造器的首行),否則編譯的時候將會出現錯誤,另外不能在構造器以外的地方以這種方式呼叫構造器。

public class dududu {
    /*
因為xx是一個動態的內部類,建立這樣的物件必須有例項與之對應,程式是在靜態方法中直接呼叫動態內部類會報這樣錯誤。   
這樣的錯誤好比類中的靜態方法不能直接呼叫動態方法。可以把該內部類宣告為static。或者不要在靜態方法中呼叫。
     */
    public static class desktop{
        public int h=10,w=10;
        public desktop() {
            this(1,2);
            System.out.println("無參建構函式");
        }
        public desktop(int h,int w) {
            //this(); 如果把這個註釋開啟,那麼建構函式互相呼叫就會死迴圈,所以會報錯
            System.out.println("有參建構函式");
        }
    }
    
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        desktop a = new desktop(1,2);
        desktop b = new desktop();
    }

}

三、返回一個類的引用

public class A{

public A(){
    new B(this).print();
}

public void print(){
      System.out.println("From A!");
 }

public static void main(String[] args) {
      new A();
   }
}
 
public class B{
   A a;
   public B(A a){
      this.a = a;
   }
 
   public void print(){
      a.print();
      System.out.println("From B!");
   }
}

注意:java中為什麼在static中不能使用this關鍵字
Static方法是類方法,先於任何的例項(物件)存在。即Static方法在類載入時就已經存在了,但是物件是在建立時才在記憶體中生成。而this指代的是當前的物件
在方法中定義使用的this關鍵字,它的值是當前物件的引用.也就是說你只能用它來呼叫屬於當前物件的方法或者使用this處理方法中成員變數和區域性變數重名的情況.
而且,更為重要的是this和super都無法出現在static 修飾的方法中,static 修飾的方法是屬於類的,該方法的呼叫者可能是一個類,而不是物件.如果使用的是類來呼叫而不是物件,
則 this就無法指向合適的物件.所以static 修飾的方法中不能使用this.