Java 菜鳥教程

Java 流程控制

Java 數(shù)組

Java 面向?qū)ο?I)

Java 面向?qū)ο?II)

Java 面向?qū)ο?III)

Java 異常處理

Java 列表(List)

Java Queue(隊(duì)列)

Java Map集合

Java Set集合

Java 輸入輸出(I/O)

Java Reader/Writer

Java 其他主題

Java this 關(guān)鍵字

在本文中,我們將通過示例了解Java中的this關(guān)鍵字,如何以及在何處使用它們。

this關(guān)鍵字

在Java中,this關(guān)鍵字用于引用方法或構(gòu)造函數(shù)中的當(dāng)前對象。例如,

class Main {
    int instVar;

    Main(int instVar){
        this.instVar = instVar;
        System.out.println("this引用= " + this);
    }

    public static void main(String[] args) {
        Main obj = new Main(8);
        System.out.println("對象引用= " + obj);
    }
}

輸出

this引用= com.ThisAndThat.MyClass@74a14482
對象引用 = com.ThisAndThat.MyClass@74a14482

在上面的示例中,我們創(chuàng)建了Main類的一個(gè)名為obj的對象。然后,我們打印對類的對象obj和this關(guān)鍵字的引用。

在這里,我們可以看到obj和this的引用是相同的。這意味著這只是對當(dāng)前對象的引用。

使用this關(guān)鍵字

在各種情況下,通常都使用this關(guān)鍵字。

使用this方法處理變量名的歧義性

在Java中,不允許在范圍(類范圍或方法范圍)內(nèi)聲明兩個(gè)或多個(gè)具有相同名稱的變量。但是,實(shí)例變量和參數(shù)可能具有相同的名稱。例如,

class MyClass {
    // 實(shí)例變量
    int age;

    // 參數(shù)
    MyClass(int age){
        age = age;
    }
}

在上面的程序中,實(shí)例變量和參數(shù)具有相同的名稱:age。在這里,由于名稱不明確,Java編譯器感到困惑。

在這種情況下,我們使用this關(guān)鍵字。例如,

首先,讓我們看一個(gè)不使用this關(guān)鍵字的示例:

class Main {

    int age;
    Main(int age){
        age = age;
    }

    public static void main(String[] args) {
        Main obj = new Main(8);
        System.out.println("obj.age = " + obj.age);
    }
}

輸出

mc.age = 0

在上面的示例中,我們已將一個(gè)值8傳遞給了構(gòu)造函數(shù)。但是,我們得到的0是輸出。這是因?yàn)镴ava編譯器由于實(shí)例變量和參數(shù)之間的名稱不明確而感到困惑。

現(xiàn)在,讓我們使用this關(guān)鍵字重寫上面的代碼。

class Main {

    int age;
    Main(int age){
        this.age = age;
    }

    public static void main(String[] args) {
        Main obj = new Main(8);
        System.out.println("obj.age = " + obj.age);
    }
}

輸出

obj.age = 8

現(xiàn)在,我們得到了預(yù)期的輸出。這是因?yàn)楫?dāng)構(gòu)造函數(shù)被調(diào)用時(shí),構(gòu)造函數(shù)內(nèi)部的內(nèi)容被調(diào)用構(gòu)造函數(shù)的對象obj所替換。因此,age變量被賦值為8。

另外,如果參數(shù)和實(shí)例變量的名稱不同,則編譯器會(huì)自動(dòng)附加this關(guān)鍵字。例如代碼:

class Main {
    int age;

    Main(int i) {
        age = i;
    }
}

等同于:

class Main {
    int age;

    Main(int i) {
        this.age = i;
    }
}

this 與Getters和Setters

this關(guān)鍵字的另一個(gè)常見用法是在類的setter和getter方法中。例如:

class Main {
   String name;

   // setter 方法
   void setName( String name ) {
       this.name = name;
   }

   // getter 方法
   String getName(){
       return this.name;
   }

   public static void main( String[] args ) {
       Main obj = new Main();

       // 調(diào)用setter和getter方法
       obj.setName("Seagull");
       System.out.println("obj.name: "+obj.getName());
   }
}

輸出

obj.name: Seagull

在這里,我們使用了this關(guān)鍵字:

  • 在setter方法中分配值

  • 在getter方法中訪問值

在構(gòu)造函數(shù)重載中使用this

在處理構(gòu)造函數(shù)重載時(shí),我們可能必須從另一個(gè)構(gòu)造函數(shù)調(diào)用一個(gè)構(gòu)造函數(shù)。在這種情況下,我們不能顯式調(diào)用構(gòu)造函數(shù)。相反,我們必須使用this關(guān)鍵字。

在這里,我們使用this關(guān)鍵字的另一種形式。也就是this()。讓我們舉個(gè)實(shí)例

class Complex {

    private int a, b;

    //帶兩個(gè)參數(shù)的構(gòu)造函數(shù)
    private Complex( int i, int j ){
        this.a = i;
        this.b = j;
    }

    //具有單個(gè)參數(shù)的構(gòu)造函數(shù)
    private Complex(int i){
        //用兩個(gè)參數(shù)調(diào)用構(gòu)造函數(shù)
        this(i, i); 
    }

    //沒有參數(shù)的構(gòu)造函數(shù)
    private Complex(){
        //用單個(gè)參數(shù)調(diào)用構(gòu)造函數(shù)
        this(0);
    }

    @Override
    public String toString(){
        return this.a + " + " + this.b + "i";
    }

    public static void main( String[] args ) {
  
                //創(chuàng)建Complex類的對象
                //使用2個(gè)參數(shù)調(diào)用構(gòu)造函數(shù) 
        Complex c1 = new Complex(2, 3); 
    
        //使用單個(gè)參數(shù)調(diào)用構(gòu)造函數(shù)
        Complex c2 = new Complex(3);

        //不帶參數(shù)調(diào)用構(gòu)造函數(shù)
        Complex c3 = new Complex();

        //打印對象
        System.out.println(c1);
        System.out.println(c2);
        System.out.println(c3);
    }
}

輸出

2 + 3i
3 + 3i
0 + 0i

在上面的示例中,我們使用了this關(guān)鍵字,

  • 從構(gòu)造函數(shù)Complex(inti)調(diào)用構(gòu)造函數(shù)Complex(inti,intj)

  • 從構(gòu)造函數(shù)Complex()調(diào)用構(gòu)造函數(shù)Complex(int i)

注意這一行,

System.out.println(c1);

在這里,當(dāng)我們打印對象c1時(shí),對象被轉(zhuǎn)換成字符串。在此過程中,將調(diào)用toString()。由于我們在類中重寫了toString()方法,因此我們根據(jù)該方法獲得輸出。

 this()的最大優(yōu)點(diǎn)之一是減少了重復(fù)代碼的數(shù)量。但是,在使用this()時(shí),我們應(yīng)該特別小心。

 這是因?yàn)閺牧硪粋€(gè)構(gòu)造函數(shù)調(diào)用構(gòu)造函數(shù)會(huì)增加開銷,而且這是一個(gè)緩慢的過程。使用this()的另一個(gè)巨大優(yōu)勢是減少重復(fù)代碼的數(shù)量。

注意:從另一個(gè)構(gòu)造函數(shù)調(diào)用一個(gè)構(gòu)造函數(shù)稱為顯式構(gòu)造函數(shù)調(diào)用。

this作為參數(shù)傳遞

我們可以使用this關(guān)鍵字將當(dāng)前對象作為參數(shù)傳遞給方法。例如,

class ThisExample {
    // declare variables
    int x;
    int y;

    ThisExample(int x, int y) {
          //為構(gòu)造函數(shù)內(nèi)的變量賦值
        this.x = x;
        this.y = y;

        //調(diào)用add()前x和y的值
        System.out.println("在將this其傳遞給addTwo()方法之前:");
        System.out.println("x = " + this.x + ", y = " + this.y);

        //調(diào)用add()方法,將this其作為參數(shù)傳遞
        add(this);

        //調(diào)用add()后x和y的值
        System.out.println("在將this其傳遞給addTwo()方法之后:");
        System.out.println("x = " + this.x + ", y = " + this.y);
    }

    void add(ThisExample o){
        o.x += 2;
        o.y += 2;
    }
}

class Main {
    public static void main( String[] args ) {
        ThisExample obj = new ThisExample(1, -2);
    }
}

輸出

在將this其傳遞給addTwo()方法之前:
x = 1, y = -2
在將this其傳遞給addTwo()方法之后:
x = 3, y = 0

在上面的示例中,在構(gòu)造函數(shù)ThisExample()中,注意下面的一行,

add(this);

在這里,我們通過將this作為參數(shù)傳遞來調(diào)用add()方法。因?yàn)閠his關(guān)鍵字包含對類的對象obj的引用,所以我們可以在add()方法中更改x和y的值。

丰满人妻一级特黄a大片,午夜无码免费福利一级,欧美亚洲精品在线,国产婷婷成人久久Av免费高清