欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java this 關(guān)鍵字的使用方法詳解

 更新時(shí)間:2017年10月13日 14:52:43   作者:ccpat  
這篇文章主要介紹了Java this 關(guān)鍵字的使用方法詳解的相關(guān)資料,希望通過本文能幫助到大家,讓大家徹底理解掌握這部分內(nèi)容,需要的朋友可以參考下

Java this 關(guān)鍵字的使用方法詳解

構(gòu)造方法中的this關(guān)鍵字

構(gòu)造方法是一個(gè)類的對(duì)象在通過new關(guān)鍵字創(chuàng)建時(shí)自動(dòng)調(diào)用的,在程序中不能向調(diào)用其他方法一樣通過方法名(也就是類名)來調(diào)用。但如果一個(gè)類有多個(gè)構(gòu)造方法,可以在一個(gè)構(gòu)造方法中通過this(paras…)來調(diào)用其他的構(gòu)造方法。
使用this來調(diào)用其他構(gòu)造方法有如下幾個(gè)約束。

1) 只能在構(gòu)造方法中通過this來調(diào)用其他構(gòu)造方法,普通方法中不能使用。
2) 不能通過this遞歸調(diào)用構(gòu)造方法,即不能在一個(gè)構(gòu)造方法中通過this直接或間接調(diào)用該構(gòu)造方法本身。

例如:

class test {
  test() {
    this(1);
  }
  test(int a){
    this();
  }
  test(int a, int b) {
    this(1, 2);
  }
}

test()方法中調(diào)用了test(int)構(gòu)造方法,而test(int)構(gòu)造方法又調(diào)用了test()構(gòu)造方法,構(gòu)成遞歸調(diào)用。test(int, int)中調(diào)用了自身,也構(gòu)成了遞歸調(diào)用。都是不允許的。

3) 通過this調(diào)用其他構(gòu)造方法必須放在構(gòu)造方法的第一行中執(zhí)行。由于super調(diào)用父類的構(gòu)造函數(shù)也必須放在構(gòu)造方法的第一行中執(zhí)行,因此,通過this和super調(diào)用構(gòu)造方法不能同時(shí)出現(xiàn)一個(gè)構(gòu)造方法中。也不能在一個(gè)構(gòu)造方法中多次調(diào)用不同的構(gòu)造方法。
在構(gòu)造方法中也可以使用this關(guān)鍵字來訪問本類中的成員變量和成員函數(shù)。其用法和非構(gòu)造方法中的this關(guān)鍵字相同。

非構(gòu)造方法中的this關(guān)鍵字

在Java中可以通過通過this關(guān)鍵字來調(diào)用類中的成員變量和方法。其用法是。

1) this.xxx; 訪問類中的成員變量xxx
2) this.yyy(paras…); 訪問類中的成員方法yyy
3) this; 當(dāng)前類對(duì)象的引用

this關(guān)鍵字訪問類的成員變量和成員函數(shù)時(shí)不受訪問權(quán)限的控制,可以訪問本類中所有的成員變量和方法,包括private的成員變量和方法。也可以通過this訪問本類的static成員,不過由于static成員可以通過類名直接訪問,如果通過this來訪問會(huì)有“The static field ××× should be accessed in a static way”的警告信息。不能在類的static成員或static塊中使用this。

繼承關(guān)系下的this關(guān)鍵字

在繼承關(guān)系下,父類中的this關(guān)鍵字并不總是表示父類中的變量和方法。this關(guān)鍵字的四種用法如前文所述,列舉如下。

1) this(paras…); 訪問其他的構(gòu)造方法
2) this.xxx; 訪問類中的成員變量xxx
3) this.yyy(paras…); 訪問類中的成員方法yyy
4) this; 當(dāng)前類對(duì)象的引用

對(duì)第一種,無論子類是否有相同參數(shù)的構(gòu)造方法,this(paras…);訪問的始終是父類中的構(gòu)造方法。
對(duì)第二種,無論子類是否有覆蓋了該成員變量,this.xxx;訪問的始終是父類中的成員變量。
對(duì)第三種,如果子類重寫了該成員方法,則this.yyy(paras…);訪問的是子類的成員方法,如果子類沒有重寫該成員方法,則this.yyy(paras…);訪問的是父類的成員方法。
對(duì)第四種,this始終代表的是子類的對(duì)象。

例如:

public class ClassTest {
  public static void main(String[] args) {
    Child child = new Child();
    child.show();
  }
}

class Parent {
  public String str;
  Parent(){
    this(1);
  }
  Parent(int a) {
    this.str = "Parent";
    this.show();
  }
  public void show() {
    System.out.println(this.str);
  }
}

class Child extends Parent {
  public String str;
  Child() {
  }
  Child(int a) {
    str = "Child";
  }
  public void show() {
    System.out.println(str);
    super.show();
  }
}

main()函數(shù)中有兩條語句,new Child()和child.show()。

第一條語句new Child()時(shí)要執(zhí)行Child類的構(gòu)造方法,但是Child類是Parent類的子類,因此會(huì)先執(zhí)行Parent類的構(gòu)造方法。Child類的無參構(gòu)造函數(shù)中沒有使用super和this來調(diào)用父類或本類中的其他的構(gòu)造方法,因此會(huì)調(diào)用父類的無參構(gòu)造函數(shù)。在父類的無參構(gòu)造函數(shù)Parent()中調(diào)用了執(zhí)行了this(1),此調(diào)用表示執(zhí)行父類中有一個(gè)整數(shù)參數(shù)的構(gòu)造方法,雖然子類中也有一個(gè)有一個(gè)整數(shù)參數(shù)的構(gòu)造方法,但是并不會(huì)被執(zhí)行。父類中有一個(gè)整數(shù)參數(shù)的構(gòu)造方法執(zhí)行this.str=”Parent”,這里的this.str代表的是父類中的成員變量str,雖然子類中也有一個(gè)成員變量str,但是并不會(huì)被賦值。將父類中的成員變量str賦值為”Parent”后,接著執(zhí)行了this.show(),雖然父類中有一個(gè)show()方法,但由于子類重寫了show()方法,所以this.show()執(zhí)行的子類的show()方法。子類的show()方法首先執(zhí)行了打印str的操作,此時(shí)打印的顯然是子類中的str,子類的str沒有被賦值,因?yàn)榇蛴ull。接著子類的show()方法執(zhí)行了super.show(),即調(diào)用了父類的show()方法,在父類的show()方法中執(zhí)行了打印this.str的操作,this.str同樣代表父類中的成員變量str,因此打印”Parent”。

第二條語句child.show()先是執(zhí)行子類的show()方法,子類的show()先是打印了子類的str值(null),然后執(zhí)行了父類的show()打印了父類的str值(”Parent”)。

兩條語句的打印結(jié)果為null, Parent, null, Parent。

如果將第一條語句改為new Child(1),則執(zhí)行的是子類的有一個(gè)整數(shù)參數(shù)的構(gòu)造方法,仍然是先執(zhí)行父類的無參構(gòu)造方法,初始化父類的str為”Parent”,然后執(zhí)行子類的show(),子類的show()打印子類的str值(null),然后執(zhí)行父類的show(),父類show()打印父類的str值(”Parent”),然后執(zhí)行子類的構(gòu)造方法將子類的str初始化為”Child”。 第二條語句child.show()先是執(zhí)行子類的show()方法,子類的show()先是打印了子類的str值(”Child”),然后執(zhí)行了父類的show()打印了父類的str值(”Parent”)。

兩條語句的打印結(jié)果為null, Parent, Child, Parent。

super和this的異同

super在一個(gè)類中用來引用其父類的成員,它是在子類中訪問父類成員的一個(gè)橋梁,并不是任何一個(gè)對(duì)象的引用,而this則表示當(dāng)前類對(duì)象的引用。在代碼中Object o = super;是錯(cuò)誤的,Object o = this;則是允許的。
super關(guān)鍵字的作用在于當(dāng)子類中覆蓋了父類的某個(gè)成員變量,或者重寫了父類的某個(gè)成員方法時(shí)還能夠訪問到父類的成員變量和成員方法。如果子類中沒有重寫父類的成員變量和成員方法,則子類會(huì)繼承父類的所有非private的成員變量和成員方法。這時(shí)在子類中無論通過this來訪問成員和通過super來訪問成員,結(jié)果都是一樣的。

super.getClass()和this.getClass()

getClass()是Object類定義的一個(gè)final方法,所有Java類的getClass()都繼承自O(shè)bject類。如前文所述,如果子類沒有重寫父類的某個(gè)成員方法,那么通過super來訪問還是還是通過this來訪問結(jié)果都是一樣的。因此,super.getClass()和this.getClass()結(jié)果是一樣的。Object類的getClass()方法返回的是該對(duì)象的運(yùn)行時(shí)類,一個(gè)對(duì)象的運(yùn)行時(shí)類是該對(duì)象通過new創(chuàng)建時(shí)指定的類。因此,super.getClass()和this.getClass()返回的都是new對(duì)象時(shí)指定的類。

例如:

public class ClassConstructorTest {
  public static void main(String[] args) {
    Child child = new Child();
    child.show();
  }
}

class Parent {
  private Parent mSelf;
  Parent(){
    mSelf = this;
  }
  public void show() {
    System.out.println(this.getClass().getName());
    System.out.println(super.getClass().getName());
    System.out.println(mSelf.getClass().getName());
  }
}

class Child extends Parent {
  public void show() {
    System.out.println(this.getClass().getName());
    System.out.println(super.getClass().getName());
    super.show();
  }
}

打印的類名都是Child。

如有疑問請(qǐng)留言或者到本站社區(qū)交流討論,感謝閱讀,希望能幫助到大家,謝謝大家對(duì)本站的支持!

相關(guān)文章

最新評(píng)論