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

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

 更新時間: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)造方法是一個類的對象在通過new關(guān)鍵字創(chuàng)建時自動調(diào)用的,在程序中不能向調(diào)用其他方法一樣通過方法名(也就是類名)來調(diào)用。但如果一個類有多個構(gòu)造方法,可以在一個構(gòu)造方法中通過this(paras…)來調(diào)用其他的構(gòu)造方法。
使用this來調(diào)用其他構(gòu)造方法有如下幾個約束。

1) 只能在構(gòu)造方法中通過this來調(diào)用其他構(gòu)造方法,普通方法中不能使用。
2) 不能通過this遞歸調(diào)用構(gòu)造方法,即不能在一個構(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)造方法不能同時出現(xiàn)一個構(gòu)造方法中。也不能在一個構(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)前類對象的引用

this關(guān)鍵字訪問類的成員變量和成員函數(shù)時不受訪問權(quán)限的控制,可以訪問本類中所有的成員變量和方法,包括private的成員變量和方法。也可以通過this訪問本類的static成員,不過由于static成員可以通過類名直接訪問,如果通過this來訪問會有“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)前類對象的引用

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

例如:

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()時要執(zhí)行Child類的構(gòu)造方法,但是Child類是Parent類的子類,因此會先執(zhí)行Parent類的構(gòu)造方法。Child類的無參構(gòu)造函數(shù)中沒有使用super和this來調(diào)用父類或本類中的其他的構(gòu)造方法,因此會調(diào)用父類的無參構(gòu)造函數(shù)。在父類的無參構(gòu)造函數(shù)Parent()中調(diào)用了執(zhí)行了this(1),此調(diào)用表示執(zhí)行父類中有一個整數(shù)參數(shù)的構(gòu)造方法,雖然子類中也有一個有一個整數(shù)參數(shù)的構(gòu)造方法,但是并不會被執(zhí)行。父類中有一個整數(shù)參數(shù)的構(gòu)造方法執(zhí)行this.str=”Parent”,這里的this.str代表的是父類中的成員變量str,雖然子類中也有一個成員變量str,但是并不會被賦值。將父類中的成員變量str賦值為”Parent”后,接著執(zhí)行了this.show(),雖然父類中有一個show()方法,但由于子類重寫了show()方法,所以this.show()執(zhí)行的子類的show()方法。子類的show()方法首先執(zhí)行了打印str的操作,此時打印的顯然是子類中的str,子類的str沒有被賦值,因為打印null。接著子類的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í)行的是子類的有一個整數(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在一個類中用來引用其父類的成員,它是在子類中訪問父類成員的一個橋梁,并不是任何一個對象的引用,而this則表示當(dāng)前類對象的引用。在代碼中Object o = super;是錯誤的,Object o = this;則是允許的。
super關(guān)鍵字的作用在于當(dāng)子類中覆蓋了父類的某個成員變量,或者重寫了父類的某個成員方法時還能夠訪問到父類的成員變量和成員方法。如果子類中沒有重寫父類的成員變量和成員方法,則子類會繼承父類的所有非private的成員變量和成員方法。這時在子類中無論通過this來訪問成員和通過super來訪問成員,結(jié)果都是一樣的。

super.getClass()和this.getClass()

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

例如:

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ū)交流討論,感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!

相關(guān)文章

  • Mybatis映射文件規(guī)則實例詳解

    Mybatis映射文件規(guī)則實例詳解

    在映射文件當(dāng)中,mapper元素是映射文件的根元素,其他的標(biāo)簽都是它的子元素,下面這篇文章主要給大家介紹了關(guān)于Mybatis映射文件規(guī)則的相關(guān)資料,需要的朋友可以參考下
    2022-04-04
  • Java中怎樣使用JSON進行文件解析

    Java中怎樣使用JSON進行文件解析

    這篇文章主要介紹了Java中怎樣使用JSON進行文件解析問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-05-05
  • Java 刪除文件及文件夾刪除不了的解決

    Java 刪除文件及文件夾刪除不了的解決

    這篇文章主要介紹了Java 刪除文件及文件夾刪除不了的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • Java實現(xiàn)紀元秒和本地日期時間互換的方法【經(jīng)典實例】

    Java實現(xiàn)紀元秒和本地日期時間互換的方法【經(jīng)典實例】

    這篇文章主要介紹了Java實現(xiàn)紀元秒和本地日期時間互換的方法,結(jié)合具體實例形式分析了Java日期時間相關(guān)操作技巧,需要的朋友可以參考下
    2017-04-04
  • Java基于Rest?Assured自動化測試接口詳解

    Java基于Rest?Assured自動化測試接口詳解

    Rest Assured 是一個基于 Java 的流行的用于測試 RESTful API 的庫。這篇文章主要介紹了Java如何基于Rest?Assured實現(xiàn)自動化測試接口,需要的可以參考一下
    2023-03-03
  • java 實現(xiàn)將一個string保存到txt文檔中

    java 實現(xiàn)將一個string保存到txt文檔中

    今天小編就為大家分享一篇java 實現(xiàn)將一個string保存到txt文檔中的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-07-07
  • java測試框架的方法

    java測試框架的方法

    這篇文章主要介紹了java測試框架的方法,文中代碼非常詳細,供大家學(xué)習(xí)和參考,感興趣的朋友可以了解下
    2020-06-06
  • spring cloud學(xué)習(xí)教程之config修改配置詳解

    spring cloud學(xué)習(xí)教程之config修改配置詳解

    這篇文章主要給大家介紹了關(guān)于spring cloud學(xué)習(xí)教程之config修改配置的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。
    2017-09-09
  • JAVA獲得包含0-9、a-z、A-Z范圍內(nèi)字符串的的隨機數(shù)實例

    JAVA獲得包含0-9、a-z、A-Z范圍內(nèi)字符串的的隨機數(shù)實例

    這篇文章主要介紹了JAVA獲得包含0-9、a-z、A-Z范圍內(nèi)字符串的的隨機數(shù)實例,包含隨機數(shù)字、隨機字符串的獲取方法,需要的朋友可以參考下
    2014-07-07
  • SpringBoot2.0新特性之配置綁定全解析

    SpringBoot2.0新特性之配置綁定全解析

    在Spring Boot 2.0中推出了Relaxed Binding 2.0,對原有的屬性綁定功能做了非常多的改進以幫助我們更容易的在Spring應(yīng)用中加載和讀取配置信息,感興趣的小伙伴們可以參考一下
    2019-03-03

最新評論