Heim >Java >javaLernprogramm >Detaillierte Erläuterung der Verwendung dieses Schlüsselworts in Java

Detaillierte Erläuterung der Verwendung dieses Schlüsselworts in Java

黄舟
黄舟Original
2017-10-14 09:35:361728Durchsuche

In diesem Artikel werden hauptsächlich die relevanten Informationen zur Verwendung des Java-Schlüsselworts im Detail vorgestellt. Ich hoffe, dass dieser Artikel jedem helfen kann, diesen Teil des Inhalts vollständig zu verstehen

Detaillierte Erklärung zur Verwendung des Schlüsselworts this in Java

Das Schlüsselwort this in der Konstruktormethode

Die Konstruktormethode ist ein Objekt von a Klasse, die den neuen Schlüssel übergibt. Sie wird automatisch aufgerufen, wenn das Wort erstellt wird. Sie kann nicht wie andere Methoden im Programm über den Methodennamen (d. h. den Klassennamen) aufgerufen werden. Wenn eine Klasse jedoch mehrere Konstruktoren hat, können Sie über diesen (paras...) in einem Konstruktor andere Konstruktoren aufrufen.
Die Verwendung dieser Funktion zum Aufrufen anderer Konstruktoren unterliegt den folgenden Einschränkungen.

1) Andere Konstruktoren können nur dadurch im Konstruktor aufgerufen werden und können nicht in gewöhnlichen Methoden verwendet werden.
2) Der Konstruktor kann dadurch nicht rekursiv aufgerufen werden, das heißt, der Konstruktor selbst kann dadurch in einem Konstruktor weder direkt noch indirekt aufgerufen werden.

Zum Beispiel:


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

Der test(int)-Konstruktor wird in der test()-Methode aufgerufen und der test(int ) Konstruktor Der test()-Konstruktor wird ebenfalls aufgerufen und bildet einen rekursiven Aufruf. Auch der Selbstaufruf in test(int, int) stellt einen rekursiven Aufruf dar. Alle sind nicht erlaubt.

3) Der Aufruf anderer Konstruktoren hierüber muss in der ersten Zeile des Konstruktors ausgeführt werden. Da Super den Konstruktor der übergeordneten Klasse aufruft, muss er auch in der ersten Zeile des Konstruktors ausgeführt werden. Daher kann der Aufruf des Konstruktors über diese und Super nicht gleichzeitig im selben Konstruktor erscheinen. Sie können verschiedene Konstruktoren nicht mehrmals in einem Konstruktor aufrufen.
Sie können auch das Schlüsselwort this im Konstruktor verwenden, um auf Mitgliedsvariablen und Mitgliedsfunktionen in dieser Klasse zuzugreifen. Seine Verwendung ist dieselbe wie die des Schlüsselworts this in Nicht-Konstruktor-Methoden.

Dieses Schlüsselwort in Nicht-Konstruktor-Methoden

In Java können Mitgliedsvariablen und Methoden in einer Klasse über das Schlüsselwort this aufgerufen werden. Seine Verwendung ist.

1) this.xxx; Zugriff auf die Member-Variable xxx in der Klasse
2) this.yyy(paras…); Zugriff auf die Member-Methode yyy in der Klasse
3) this ; derzeit Verweise auf Klassenobjekte

Das Schlüsselwort this unterliegt beim Zugriff auf Mitgliedsvariablen und Mitgliedsfunktionen der Klasse keiner Zugriffsberechtigungskontrolle. Es kann auf alle Mitgliedsvariablen und Methoden in dieser Klasse zugreifen, einschließlich privater Mitgliedsvariablen und Methode. Sie können hierüber auch auf statische Mitglieder dieser Klasse zugreifen. Da auf statische Mitglieder jedoch direkt über den Klassennamen zugegriffen werden kann, wird bei diesem Zugriff die Warnmeldung „Auf das statische Feld ××× sollte in a zugegriffen werden“ angezeigt statischer Weg". Dies kann nicht innerhalb eines statischen Mitglieds einer Klasse oder innerhalb eines statischen Blocks verwendet werden.

Dieses Schlüsselwort unter Vererbungsbeziehung

Unter Vererbungsbeziehung repräsentiert das Schlüsselwort this in der übergeordneten Klasse nicht immer die Variablen und Methoden in der übergeordneten Klasse. Die vier Verwendungen dieses Schlüsselworts sind wie oben erwähnt und werden unten aufgeführt.

1) this(paras…); Zugriff auf andere Konstruktoren
2) this.xxx; Zugriff auf Mitgliedsvariablen xxx in der Klasse
3) this.yyy(paras…) ; Mitgliedsmethoden in der Klasse yyy
4) this; Referenz des aktuellen Klassenobjekts

Für den ersten Typ, unabhängig davon, ob die Unterklasse einen Konstruktor mit denselben Parametern hat, this(paras…) ) ;Der Zugriff erfolgt immer auf den Konstruktor in der übergeordneten Klasse.
Für den zweiten Typ greift this.xxx immer auf die Mitgliedsvariable in der übergeordneten Klasse zu, unabhängig davon, ob die Unterklasse die Mitgliedsvariable überschreibt.
Wenn die Unterklasse die Mitgliedsmethode überschreibt, greift this.yyy(paras...); auf die Mitgliedsmethode der Unterklasse zu. Wenn die Unterklasse die Mitgliedsmethode nicht überschreibt, dann this.yyy ( paras...); greift auf die Mitgliedsmethoden der übergeordneten Klasse zu.
Für den vierten Typ stellt dies immer das Objekt der Unterklasse dar.

Zum Beispiel:


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();
  }
}

Es gibt zwei Anweisungen in der main()-Funktion, new Child() und child.show( ).

Wenn die erste Anweisung new Child() ausgeführt wird, wird der Konstruktor der Child-Klasse ausgeführt. Die Child-Klasse ist jedoch eine Unterklasse der Parent-Klasse, also der Konstruktor der Parent-Klasse wird zuerst ausgeführt. Der parameterlose Konstruktor der untergeordneten Klasse verwendet Super und dies nicht, um die übergeordnete Klasse oder andere Konstruktoren in dieser Klasse aufzurufen, sodass der parameterlose Konstruktor der übergeordneten Klasse aufgerufen wird. This(1) wird im parameterlosen Konstruktor Parent() der übergeordneten Klasse aufgerufen und ausgeführt. Dieser Aufruf bedeutet, dass der Konstruktor mit einem ganzzahligen Parameter in der Unterklasse ausgeführt wird es wird nicht ausgeführt. Die Konstruktormethode mit einem ganzzahligen Parameter in der übergeordneten Klasse führt this.str="Parent" aus. This.str stellt hier die Mitgliedsvariable str in der übergeordneten Klasse dar. In der Unterklasse gibt es zwar auch eine Mitgliedsvariable str Auftrag verwendet. Nachdem die Mitgliedsvariable str in der übergeordneten Klasse „Parent“ zugewiesen wurde, wird this.show() ausgeführt. Obwohl es in der übergeordneten Klasse eine show()-Methode gibt, überschreibt die Unterklasse die show()-Methode show()-Methode der von show() ausgeführten Unterklasse. Die show()-Methode der Unterklasse führt zunächst den Vorgang zum Drucken von str aus. Zu diesem Zeitpunkt wird offensichtlich der str in der Unterklasse ausgegeben, da null gedruckt wird. Dann führt die show()-Methode der Unterklasse super.show() aus, das heißt, die show()-Methode der übergeordneten Klasse wird aufgerufen. In der show()-Methode der übergeordneten Klasse erfolgt die Operation zum Drucken von this.str This.str stellt auch die Mitgliedsvariable str in der übergeordneten Klasse dar, sodass „Parent“ gedruckt wird.

第二条语句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。

Das obige ist der detaillierte Inhalt vonDetaillierte Erläuterung der Verwendung dieses Schlüsselworts in Java. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn