JavaRush /Java Blog /Random-JA /Javaのthisキーワードとsuperキーワードの違い
grishin
レベル 27
Харьков

Javaのthisキーワードとsuperキーワードの違い

Random-JA グループに公開済み
thisと はsuperJava の 2 つの特別なキーワードで、それぞれクラスの現在のインスタンスとそのスーパークラスを表します。Java プログラマーはこれらの単語を混同することが多く、その特殊な特性についてほとんど認識していませんが、Java Core のインタビューでよく質問されます。たとえば、すぐに思い浮かぶ質問はthisと、 Java のsuperキーワードに別の意味を割り当てることは可能ですか? などです。Java のキーワードとthisの違いは何ですか。わかりません?そうですね、ここでは答えを示しません。答えは記事の最後にあります。 最初に述べたように、Java におけるとの主な違いは、クラスの現在のインスタンスが表すのに対し、親クラスの現在のインスタンスが表すということです。ここでは、変数の使用例を 1 つ示します。おそらく、あるコンストラクターから別のコンストラクターを呼び出す、いわゆる例をすでに見たことがあるでしょう。チェーン内でコンストラクターを呼び出す場合、キーワードとを使用することで可能になります。クラス内では、引数なしのコンストラクタを呼び出すために が使用されますが、引数なしのコンストラクタ、または親クラスのデフォルト コンストラクタを呼び出すためにも が使用されます。ちなみに、この方法では、引数なしでコンストラクターを呼び出すだけでなく、適切なパラメーターを渡すことで他のコンストラクターを呼び出すこともできます。この使用例については後ほど説明します。Javaでは、クラス インスタンスとその親の変数にアクセスするためにも使用されます。実際、これらの変数は接頭辞となしでアクセスできますが、現在のブロック内でそのような変数が他の変数と重複していない場合に限ります。同じ名前のローカル変数が含まれていない場合は、接頭辞付きの名前を使用する必要がありますが、これは問題ではありません。この形式ではさらに読みやすくなります。このアプローチの典型的な例は、インスタンス変数と同じ名前のパラメーターを受け取るコンストラクターを内部で使用することです。この記事の後半では、と の間に他にどのような違いがあるかを確認し、それらの使用例をいくつか見ていきます。 thissuperJava の this キーワードと super キーワードの違い - 1thissuperthissuperthissuperthissuperthis()super()thissuperthissupersuperthisthissuperthis

これとスーパーはどのように似ているのか

thisキーワードとの違いを説明する前にsuper、それらの類似点をいくつか見てみましょう。
  1. this、 、 は両方ともsuper非静的変数であるため、静的コンテキストでは使用できません。つまり、main メソッドでは使用できません。これにより、「非静的変数はthis静的コンテキストから参照できません」というコンパイル時エラーが発生します。main メソッドでキーワードを使用した場合も、同じことが起こりますsuper

  2. thisとの両方をsuperコンストラクター内で使用して、チェーン内の他のコンストラクターを呼び出すことができます。たとえば、this() とsuper() はそれぞれ、継承クラスと親クラスの引数なしでコンストラクターを呼び出します。
以下の例では、最初にクラス B の引数なしのコンストラクターから、 type の単一パラメーターを取る同じクラス B のコンストラクターに呼び出しを渡しString、次にsuper("")スーパークラスから 1 つの引数を持つコンストラクターを呼び出します。
class A{

    A(){
        System.out.println("Конструктор без аргументов класса A");
    }

    A(String args){
        System.out.println("Конструктор с одним аргументом класса A");
    }
}

class B extends A{

   B(){
        this(""); // вызов конструктора с одним аргументом класса B
        System.out.println("Конструктор без аргументов класса B");
    }

   B(String args){
        super(""); // вызов конструктора с одним аргументом класса A
        System.out.println("Конструктор с одним аргументом класса B");
    }
}

// Тест-класс и вывод
public class Test {

    public static void main(String args[]) {
       B b = new B();
    }

}
出力: クラス A の 1 引数コンストラクター クラス B の 1 引数コンストラクター クラス B の引数なしコンストラクター
  1. コンストラクター内でthis、 および はsuper他のすべての式の上の先頭に指定する必要があります。そうしないと、コンパイラーによってエラー メッセージが発行されます。このことから、1 つのコンストラクターにthis()との両方を含めることはできないことがわかりますsuper()

スーパーとこれの違い

これで、キーワードの使用方法superと、thisキーワードが何に必要なのかを理解できました。しかし、私が言及しなかったこれらのキーワードを使用するための別のオプションがあります。内部クラスでは、それらの助けを借りて、外部表記形式を使用して外部クラスを参照するのが非常に便利です。this現在のインスタンスと外側の。super- 彼の親のために。忘れずに、Outer を外部クラスの名前に置き換えてください。thisここで、キーワードとキーワードの主な違いを簡単にリストアップしてみましょう。super
  1. 変数はthisそれが使用されているクラスの現在のインスタンスを指しますが、変数はsuper親クラスの現在のインスタンスを指します。

  2. 各コンストラクターは、他のコンストラクターへの明示的な呼び出しがない場合、その親クラスの引数なしのコンストラクターを暗黙的に呼び出しますが、 、 、super()のいずれかを使用して他のコンストラクターを明示的に呼び出すオプションが常にあります。this()super()
thisJava におけるキーワードとの違い、およびそれらがプログラム内でどのように使用されるかについて言えることはおそらくこれだけですsuper。これまで見てきたように、それらの主な目的は、あるコンストラクターを別のコンストラクターから呼び出し、現在のクラスとその親クラスで宣言されたインスタンス変数を参照することです。これらはまったく普通の変数ではないことを忘れないでください。これが、最初の段落で尋ねた私の質問に対する答えです。いいえ、変数はthisfinalとして宣言されているため、新しい値を割り当てることはできません。IDE でこれを実行しようとすると、「変数に新しい値を割り当てることはできません。this最終変数として宣言されています。」という コンパイル エラーが発生します。元の記事はこちら
コメント
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION