最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

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

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

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

1) 只能在構(gòu)造方法中通過(guò)this來(lái)調(diào)用其他構(gòu)造方法,普通方法中不能使用。
2) 不能通過(guò)this遞歸調(diào)用構(gòu)造方法,即不能在一個(gè)構(gòu)造方法中通過(guò)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) 通過(guò)this調(diào)用其他構(gòu)造方法必須放在構(gòu)造方法的第一行中執(zhí)行。由于super調(diào)用父類的構(gòu)造函數(shù)也必須放在構(gòu)造方法的第一行中執(zhí)行,因此,通過(guò)this和super調(diào)用構(gòu)造方法不能同時(shí)出現(xiàn)一個(gè)構(gòu)造方法中。也不能在一個(gè)構(gòu)造方法中多次調(diào)用不同的構(gòu)造方法。
在構(gòu)造方法中也可以使用this關(guān)鍵字來(lái)訪問(wèn)本類中的成員變量和成員函數(shù)。其用法和非構(gòu)造方法中的this關(guān)鍵字相同。

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

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

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

this關(guān)鍵字訪問(wèn)類的成員變量和成員函數(shù)時(shí)不受訪問(wèn)權(quán)限的控制,可以訪問(wèn)本類中所有的成員變量和方法,包括private的成員變量和方法。也可以通過(guò)this訪問(wèn)本類的static成員,不過(guò)由于static成員可以通過(guò)類名直接訪問(wèn),如果通過(guò)this來(lái)訪問(wèn)會(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…); 訪問(wèn)其他的構(gòu)造方法
2) this.xxx; 訪問(wèn)類中的成員變量xxx
3) this.yyy(paras…); 訪問(wèn)類中的成員方法yyy
4) this; 當(dāng)前類對(duì)象的引用

對(duì)第一種,無(wú)論子類是否有相同參數(shù)的構(gòu)造方法,this(paras…);訪問(wèn)的始終是父類中的構(gòu)造方法。
對(duì)第二種,無(wú)論子類是否有覆蓋了該成員變量,this.xxx;訪問(wèn)的始終是父類中的成員變量。
對(duì)第三種,如果子類重寫(xiě)了該成員方法,則this.yyy(paras…);訪問(wèn)的是子類的成員方法,如果子類沒(méi)有重寫(xiě)該成員方法,則this.yyy(paras…);訪問(wèn)的是父類的成員方法。
對(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ù)中有兩條語(yǔ)句,new Child()和child.show()。

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

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

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

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

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

super和this的異同

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

super.getClass()和this.getClass()

getClass()是Object類定義的一個(gè)final方法,所有Java類的getClass()都繼承自O(shè)bject類。如前文所述,如果子類沒(méi)有重寫(xiě)父類的某個(gè)成員方法,那么通過(guò)super來(lái)訪問(wèn)還是還是通過(guò)this來(lái)訪問(wèn)結(jié)果都是一樣的。因此,super.getClass()和this.getClass()結(jié)果是一樣的。Object類的getClass()方法返回的是該對(duì)象的運(yùn)行時(shí)類,一個(gè)對(duì)象的運(yùn)行時(shí)類是該對(duì)象通過(guò)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。

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

相關(guān)文章

  • Java Set集合去重的原理及實(shí)現(xiàn)

    Java Set集合去重的原理及實(shí)現(xiàn)

    這篇文章主要介紹了Java Set集合去重的原理及實(shí)現(xiàn),幫助大家更好的理解和學(xué)習(xí)Java,感興趣的朋友可以了解下
    2020-09-09
  • Java?String類的理解及字符串常量池介紹

    Java?String類的理解及字符串常量池介紹

    這篇文章主要介紹了Java?String類的理解及字符串常量池介紹,文章圍繞主題展開(kāi)詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下
    2022-09-09
  • 詳解Spring Security認(rèn)證流程

    詳解Spring Security認(rèn)證流程

    這篇文章主要介紹了Spring Security認(rèn)證流程,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-02-02
  • SpringBoot整合Elasticsearch游標(biāo)查詢的示例代碼(scroll)

    SpringBoot整合Elasticsearch游標(biāo)查詢的示例代碼(scroll)

    這篇文章主要介紹了SpringBoot整合Elasticsearch游標(biāo)查詢(scroll),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-10-10
  • 使用springcloud+oauth2攜帶token去請(qǐng)求其他服務(wù)

    使用springcloud+oauth2攜帶token去請(qǐng)求其他服務(wù)

    這篇文章主要介紹了使用springcloud+oauth2攜帶token去請(qǐng)求其他服務(wù)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-08-08
  • java實(shí)現(xiàn)微信支付結(jié)果通知

    java實(shí)現(xiàn)微信支付結(jié)果通知

    這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)微信支付結(jié)果通知,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-01-01
  • SpringBoot+WebMagic+MyBaties實(shí)現(xiàn)爬蟲(chóng)和數(shù)據(jù)入庫(kù)的示例

    SpringBoot+WebMagic+MyBaties實(shí)現(xiàn)爬蟲(chóng)和數(shù)據(jù)入庫(kù)的示例

    WebMagic是一個(gè)開(kāi)源爬蟲(chóng)框架,本項(xiàng)目通過(guò)在SpringBoot項(xiàng)目中使用WebMagic去抓取數(shù)據(jù),最后使用MyBatis將數(shù)據(jù)入庫(kù)。具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-10-10
  • redis 獲取 list 中的所有元素操作

    redis 獲取 list 中的所有元素操作

    這篇文章主要介紹了redis 獲取 list 中的所有元素操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2021-03-03
  • java如何使用fastjson修改多層嵌套的Objectjson數(shù)據(jù)

    java如何使用fastjson修改多層嵌套的Objectjson數(shù)據(jù)

    這篇文章主要介紹了java如何使用fastjson修改多層嵌套的Objectjson數(shù)據(jù)問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-05-05
  • idea2020中復(fù)制一個(gè)微服務(wù)實(shí)例的方法

    idea2020中復(fù)制一個(gè)微服務(wù)實(shí)例的方法

    這篇文章主要介紹了idea2020中復(fù)制一個(gè)微服務(wù)實(shí)例的方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-09-09

最新評(píng)論

霍城县| 咸阳市| 封丘县| 黔南| 麟游县| 华坪县| 仪陇县| 广饶县| 华安县| 搜索| 永川市| 浦县| 孟连| 明溪县| 乌拉特后旗| 古浪县| 隆昌县| 疏附县| 彭阳县| 新民市| 成安县| 明水县| 鞍山市| 大化| 临城县| 武威市| 灵川县| 象州县| 新余市| 福建省| 信丰县| 泰来县| 罗城| 济阳县| 临夏县| 周口市| 三江| 通江县| 清河县| 鱼台县| 宁陕县|