ホームページ >Java >&#&チュートリアル >Java でのこのキーワードの使用の詳細な説明

Java でのこのキーワードの使用の詳細な説明

黄舟
黄舟オリジナル
2017-10-14 09:35:361729ブラウズ

この記事では、主に Java this キーワードの使用に関する関連情報を詳しく紹介します。この記事が、この部分の内容を完全に理解して習得するのに役立つことを願っています。必要な友人は、

Java this キーワードの詳細な説明を参照してください。使用法

コンストラクターメソッドの this キーワード

コンストラクターメソッドは、new キーワードを通じてクラスのオブジェクトが作成されるときに自動的に呼び出されます。プログラム内では、メソッド名 (つまり、メソッド名) を介して他のメソッドを呼び出すことはできません。は、クラス名) を呼び出します。ただし、クラスに複数のコンストラクターがある場合は、1 つのコンストラクターでこれ (paras...) を介して他のコンストラクターを呼び出すことができます。
これを使用して他のコンストラクターを呼び出すには、次の制約があります。

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 を介してコンストラクターを呼び出すことは、同じコンストラクター内で同時に使用できません。 1 つのコンストラクターで異なるコンストラクターを複数回呼び出すことはできません。
コンストラクターで this キーワードを使用して、このクラスのメンバー変数とメンバー関数にアクセスすることもできます。その使用法は、非コンストラクター メソッドの this キーワードと同じです。

非コンストラクター メソッドの This キーワード

Java では、this キーワードを通じてクラス内のメンバー変数とメソッドを呼び出すことができます。その使い方は。

1) this.xxx; クラスのメンバー変数 xxx にアクセスします
2) this.yyy(paras…); クラスのメンバーメソッド yyy にアクセスします

このキーワード クラスのメンバ変数およびメンバ関数へのアクセスは、プライベート メンバ変数およびメソッドを含む、このクラス内のすべてのメンバ変数およびメソッドにアクセスできます。このクラスの静的メンバには this からもアクセスできますが、静的メンバはクラス名で直接アクセスできるため、これでアクセスすると「静的フィールド ××× は a でアクセスする必要があります。」という警告メッセージが表示されます。静的な方法」。これは、クラスの静的メンバー内または静的ブロック内では使用できません。

継承関係における this キーワード

継承関係において、親クラスの this キーワードは、必ずしも親クラスの変数やメソッドを表すとは限りません。このキーワードの 4 つの用途は上記の通りであり、以下にリストします。


1) this(paras…); 他のコンストラクターにアクセスします

2) this.xxx; クラスのメンバー変数 xxx にアクセスします
3) this.yyy(paras…); クラスのメンバー メソッド yyy にアクセスします
4) ; 現在のクラス オブジェクトへの参照

最初の型の場合、サブクラスに同じパラメーターを持つコンストラクターがあるかどうかに関係なく、this(paras...); は常に親クラスのコンストラクターにアクセスします。

2 番目のタイプの場合、サブクラスがメンバー変数をオーバーライドするかどうかに関係なく、this.xxx は常に親クラスのメンバー変数にアクセスします。 3 番目のタイプでは、サブクラスがメンバー メソッドをオーバーライドする場合、this.yyy(paras...); サブクラスがメンバー メソッドをオーバーライドしない場合、this.yyy(paras) がアクセスします。 ...); 親クラスのメンバー メソッドにアクセスします。
4 番目のタイプの場合、これは常にサブクラスのオブジェクトを表します。


例:

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() という 2 つのステートメントがあります。


最初のステートメント new Child() が実行されると、Child クラスのコンストラクターが実行されますが、Child クラスは Parent クラスのサブクラスであるため、Parent クラスのコンストラクターが最初に実行されます。 Child クラスのパラメーターなしのコンストラクターは、親クラスまたはこのクラス内の他のコンストラクターを呼び出すために super と this を使用しないため、親クラスのパラメーターなしのコンストラクターが呼び出されます。 this(1) は、親クラスのパラメータなしのコンストラクタ Parent() で呼び出されて実行されます。この呼び出しは、親クラス内に整数パラメータを持つコンストラクタを実行することを意味しますが、サブクラスにも整数パラメータを持つコンストラクタが存在します。それは実行されません。親クラスの整数パラメーターを持つコンストラクター メソッドは this.str="Parent" を実行します。ここでの This.str は親クラスのメンバー変数 str を表しますが、サブクラスにもメンバー変数 str はありません。割り当てが使用されます。親クラスのメンバー変数 str を「Parent」に代入した後、this.show() が実行されます。親クラスには show() メソッドがありますが、サブクラスは show() メソッドをオーバーライドするため、 this.show() が実行されます。 show() によって実行されるサブクラスの show() メソッド。サブクラスの show() メソッドは、最初に str を出力する操作を実行します。このとき、出力されるのは明らかにサブクラス内の str であり、null が出力されます。次に、サブクラスの show() メソッドが super.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 でのこのキーワードの使用の詳細な説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。