java中關鍵字this的使用

  在團隊代碼中看到對於當前類中的方法,使用了this關鍵字。通過測試發現,在此種狀況下,this關鍵字的使用無關緊要。所以,對java中this的使用作下總結:java

package testTHIS;

public class TestTHIS {

    int flag = 0;

    public static void main(String[] args) {
        Test test = new Test();
        test.main();

        TestTHIS tt = new TestTHIS();
        tt.say(); // 不能使用this.say();
    }

    public void say() {
        MyTest mt = new MyTest();
        mt.main();
        int i = this.flag;
        int k = flag;
    }
}

class Test {

    public void main() {
        say1();
        this.say1();
        say2();
        this.say2();
        say3();
        this.say3();
        say4();
        this.say4();
    }

    public void say1() {
        System.out.println("111111111111111");
    }

    protected void say2() {
        System.out.println("222222222222222");
    }

    void say3() {
        System.out.println("333333333333333");
    }

    private void say4() {
        System.out.println("444444444444444");
    }
}

class MyTest extends Test {

    @Override
    public void main() {
        this.say1();
    }
}
Java中不推薦使用this關鍵字的狀況

  對於兩種狀況,必須使用關鍵字this。構造方法中和內部類調用外部類當中的方法,demo以下:ide

public class Test {
    private final int number;

    public Test(int number){
        this.number = number; // 輸出5
        // number = number; 輸出0
    }

    public static void main(String[] args) {
        Test ts = new Test(5);
        System.out.println(ts.number);
    }
}

  上面的示例代碼展現了構造方法中使用this的狀況,若是不使用會出錯。此外咱們能夠查看JDK的源碼,如String類中的多種構造方法,都使用了this關鍵字。此外,我卻是以爲this不少狀況下只是標識做用了,好比區分一下this.name 跟 super.name 一個是本身的,一個是父類的。僅僅是爲了代碼可讀。函數

public class A {
    int i = 1;
    public A(){
        // thread是匿名類對象,它的run方法中用到了外部類的run方法
        // 這時因爲函數同名,直接調用就不行了
        // 解決辦法: 外部類的類名加上this引用來講明要調用的是外部類的方法run
        // 在該類的有事件監聽或者其餘方法的內部若要調用該類的引用,用this就會出錯,這時可使用類名.this,就ok了
        Thread thread = new Thread() {

            @Override
            public void run() {
                for (;;) {
                    A.this.run();
                    try {
                        sleep(1000);
                    } catch (InterruptedException ie) {
                    }
                }
            }
        };
        thread.start();
    }

    public void run() {
        System.out.println("i = " + i);
        i++;
    }

    public static void main(String[] args) throws Exception {
        new A();
    }
}

  上述展現了匿名內部類中使用關鍵字this的用法,當內部類中的方法和外部類中的方法同名的時候,若是想在內部類中使用外部類中的同名方法,要用外部類.this.方法類,來顯示的使用外部類中的同名方法。測試

相關文章
相關標籤/搜索