真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

如何正確的在Java中使用this關(guān)鍵字

如何正確的在Java中使用this關(guān)鍵字?相信很多沒有經(jīng)驗(yàn)的人對此束手無策,為此本文總結(jié)了問題出現(xiàn)的原因和解決方法,通過這篇文章希望你能解決這個問題。

創(chuàng)新互聯(lián)從2013年成立,是專業(yè)互聯(lián)網(wǎng)技術(shù)服務(wù)公司,擁有項(xiàng)目做網(wǎng)站、成都做網(wǎng)站網(wǎng)站策劃,項(xiàng)目實(shí)施與項(xiàng)目整合能力。我們以讓每一個夢想脫穎而出為使命,1280元谷城做網(wǎng)站,已為上家服務(wù),為谷城各地企業(yè)和個人服務(wù),聯(lián)系電話:18980820575

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沒有被賦值,因?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í)行的是子類的有一個整數(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()方法返回的是該對象的運(yùn)行時類,一個對象的運(yùn)行時類是該對象通過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。

看完上述內(nèi)容,你們掌握如何正確的在Java中使用this關(guān)鍵字的方法了嗎?如果還想學(xué)到更多技能或想了解更多相關(guān)內(nèi)容,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝各位的閱讀!


當(dāng)前題目:如何正確的在Java中使用this關(guān)鍵字
文章來源:http://weahome.cn/article/gggici.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部