首頁  >  文章  >  Java  >  Java中關於this關鍵字的使用詳解

Java中關於this關鍵字的使用詳解

黄舟
黄舟原創
2017-10-14 09:35:361678瀏覽

這篇文章主要介紹了Java this 關鍵字的使用方法詳解的相關資料,希望透過本文能幫助到大家,讓大家徹底理解掌握這部分內容,需要的朋友可以參考下

Java this 關鍵字的使用方法詳解

建構方法中的this關鍵字

建構方法是一個類別的物件在透過new關鍵字創建時自動呼叫的,在程式中不能向呼叫其他方法一樣透過方法名稱(也就是類別名稱)來呼叫。但如果一個類別有多個建構方法,可以在一個建構方法中透過this(paras…)來呼叫其他的建構方法。
使用this來呼叫其他建構方法有以下幾個約束。

1) 只能在建構方法中透過this來呼叫其他建構方法,在普通方法中不能使用。
2) 不能透過this遞歸呼叫建構方法,即不能在一個建構方法中透過this直接或間接呼叫該建構方法本身。

例如:


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

test()方法中呼叫了test(int)建構方法,而test(int)建構方法又被調用了test()建構方法,構成遞迴呼叫。 test(int, int)中呼叫了自身,也構成了遞迴呼叫。都是不允許的。

3) 透過this呼叫其他建構方法必須放在建構方法的第一行中執行。由於super呼叫父類別的建構子也必須放在建構方法的第一行中執行,因此,透過this和super呼叫建構方法不能同時出現一個建構方法中。也不能在一個構造方法中多次呼叫不同的構造方法。
在建構方法中也可以使用this關鍵字來存取本類別中的成員變數和成員函數。其用法和非建構方法中的this關鍵字相同。

非建構方法中的this關鍵字

在Java中可以透過this關鍵字來呼叫類別中的成員變數和方法。其用法為。

1) this.xxx; 存取類別中的成員變數xxx
2) this.yyy(paras…); 存取類別中的成員方法yyy
3) this; 目前類別物件的參考

this關鍵字存取類別的成員變數和成員函數時不受存取權限的控制,可以存取本類別中所有的成員變數和方法,包括private的成員變數和方法。也可以透過this訪問本類的static成員,不過由於static成員可以透過類別名稱直接訪問,如果透過this來存取會有「The static field ××× should be accessed in a static way」的警告訊息。不能在類別的static成員或static區塊中使用this。

繼承關係下的this關鍵字

在繼承關係下,父類別中的this關鍵字並不總是表示父類別中的變數和方法。 this關鍵字的四種用法如前文所述,列舉如下。

1) this(paras…); 存取其他的建構方法
2) this.xxx; 存取類別中的成員變數xxx
3) this.yyy(paras…) ; 存取類別中的成員方法yyy
4) this; 目前類別物件的參考

對第一種,無論子類別是否有相同參數的建構方法,this(paras…) ;存取的始終是父類別中的建構方法。
對第二種,無論子類別是否有覆寫了該成員變量,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()函數中有兩個語句,new Child()和child.show()。

第一個語句new Child()時要執行Child類別的建構方法,但Child類別是Parent類別的子類,因此會先執行Parent類別的建構方法。 Child類別的無參建構子中沒有使用super和this來呼叫父類別或本類別中的其他的建構方法,因此會呼叫父類別的無參構造函數。在父類別的無參建構子Parent()中呼叫了執行了this(1),此呼叫表示執行父類別中有一個整數參數的建構方法,雖然子類別中也有一個有一個整數參數的建構方法,但是並不會被執行。父類別中有一個整數參數的建構方法執行this.str=”Parent”,這裡的this.str代表的是父類別中的成員變數str,雖然子類別中也有一個成員變數str,但是並不會被賦值。將父類別中的成員變數str賦值為」Parent」後,接著執行了this.show(),雖然父類別中有一個show()方法,但由於子類別重寫了show()方法,所以this. show()執行的子類別的show()方法。子類別的show()方法首先執行了列印str的操作,此時列印的顯然是子類別中的str,子類別的str沒有被賦值,因為列印null。接著子類別的show()方法執行了super.show(),也就是呼叫了父類別的show()方法,在父類別的show()方法中執行了列印this.str的操作,this.str同樣代表父類別中的成員變數str,因此列印”Parent”。

第二条语句child.show()先是执行子类的show()方法,子类的show()先是打印了子类的str值(null),然后执行了父类的show()打印了父类的str值(”Parent”)。

两条语句的打印结果为null, Parent, null, Parent。

如果将第一条语句改为new Child(1),则执行的是子类的有一个整数参数的构造方法,仍然是先执行父类的无参构造方法,初始化父类的str为”Parent”,然后执行子类的show(),子类的show()打印子类的str值(null),然后执行父类的show(),父类show()打印父类的str值(”Parent”),然后执行子类的构造方法将子类的str初始化为”Child”。 第二条语句child.show()先是执行子类的show()方法,子类的show()先是打印了子类的str值(”Child”),然后执行了父类的show()打印了父类的str值(”Parent”)。

两条语句的打印结果为null, Parent, Child, Parent。

super和this的异同

super在一个类中用来引用其父类的成员,它是在子类中访问父类成员的一个桥梁,并不是任何一个对象的引用,而this则表示当前类对象的引用。在代码中Object o = super;是错误的,Object o = this;则是允许的。
super关键字的作用在于当子类中覆盖了父类的某个成员变量,或者重写了父类的某个成员方法时还能够访问到父类的成员变量和成员方法。如果子类中没有重写父类的成员变量和成员方法,则子类会继承父类的所有非private的成员变量和成员方法。这时在子类中无论通过this来访问成员和通过super来访问成员,结果都是一样的。

super.getClass()和this.getClass()

getClass()是Object类定义的一个final方法,所有Java类的getClass()都继承自Object类。如前文所述,如果子类没有重写父类的某个成员方法,那么通过super来访问还是还是通过this来访问结果都是一样的。因此,super.getClass()和this.getClass()结果是一样的。Object类的getClass()方法返回的是该对象的运行时类,一个对象的运行时类是该对象通过new创建时指定的类。因此,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。

以上是Java中關於this關鍵字的使用詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn