JavaRush /Java Blog /Random-JA /このキーワードを{例に示します}

このキーワードを{例に示します}

Random-JA グループに公開済み
JavaRush では、学生は最初の講義から文字通りキーワードを学びますthis。そして時間が経つにつれて、それが何を意味するかが明らかになります。しかし、多くの人は、振り返ってみると、長い間、このキーワードの禅を実現できなかったと正直に自分に言うでしょう。thisこの記事では、キーワードの使い方がまだ分からない人のために、キーワードの使い方の秘密のベールを解きます...ようこそ! Schildt の Java参考書を手に取ると、171 ページに、thisメソッドがそれを呼び出したオブジェクトを参照できるようにキーワードが必要であることが書かれています。実はこれで終わりなのかもしれない。しかし、詳細が必要です。 このキーワード {例中} - 1原則として、次の 2 つの場合に使用するthis必要があります
  1. クラスインスタンス変数とメソッド/コンストラクタ変数が同じ名前の場合。
  2. ある型のコンストラクター (デフォルトまたはパラメーター化されたコンストラクターなど) を別の型から呼び出す必要がある場合。これは、明示的なコンストラクター呼び出しとも呼ばれます。
それだけです。実際には大したことはありません。この恐ろしいキーワードが使用されている例は 2 つだけです。次に、これら 2 つの状況を例を挙げて見てみましょう。

例 1 - インスタンス変数とメソッド変数が同じ名前である

Human「name」フィールドが定義されている クラスがあるとします。 変数のセッターを作成しこのキーワード {例中} - 2ましょうname(セッターは非常に機能しており、ここにはトリックはありません): 変数をこのキーワード {例中} - 3メソッド (セッター) に渡していることに注意してください。 )。新しい変数を導入しました。この変数はメソッドの {中括弧} 内でのみ表示されるため、(一般に) 任意に呼び出すことができます。セッターに次の 1 行があることに注意してください。 setNameString newNamesetName
name = newName;
つまり、実際には、新しい変数を導入しnewName、それをクラス内にすでに存在する変数に割り当てましたname。多くのプログラマーは、結局同じことを話しているのに、新しい名前の変数を導入するのは奇妙だと考えました。クラス内での名前についてHuman。したがって、言語開発者は、1 つの変数名を使用することを便利にすることを考えました。言い換えれば、同じことを意味する変数になぜ 2 つの名前があるのか​​ということです。つまり、次のようなことをしたいのですが、 このキーワード {例中} - 4この場合、問題が発生します。これで、同じ名前の 2 つの変数ができました。1 つはString nameクラスに属しHuman、もう 1 つはString nameそのメソッドに属しますsetName。したがって、Java マシンは、セッターに文字列を記述するときに、どの変数を意味するのかを認識できません。
name = name;
nameJava はメソッドから 最も近いものを取得しますsetName
このキーワード {例中} - 5
そして、このメソッドから変数に値を代入するだけであることがわかりますname。もちろんそれは意味がありません。nameしたがって、クラスの変数とメソッドのHuman変数を区別する何らかの方法が必要でした。この問題を解決するために、キーワードが導入されました。この場合、メソッドではなく変数を呼び出す必要があることを示します。クラスの: namesetNamethisHuman
このキーワード {例中} - 6
つまり、this記事の冒頭で述べたように、呼び出し元のオブジェクトを参照します。その結果、作成されたオブジェクトにはセッターを介して人の名前がsetName設定されます。以下はキーワードを使用しないコードですthis。このコードはクラス オブジェクトを作成しHuman、名前を付けます。
このキーワード {例中} - 7
以下は、キーワードを含むプログラム コードですthis
public class Solution{
    public static void main(String[] args) {
        Human human1 = new Human();
        human1.setName("Volodya");
        human1.print();
    }
}
class Human{
    String name;
    public String getName() {
        return name;
    }
    public void setName(String name){
        this.name = name;
    }
    void print(){
        System.out.println(name);
    }
}
したがって、this同じものを示す新しい変数の導入が回避され、追加の変数によるコードの「過負荷」が軽減されます。

例 2 - これを使用してコンストラクターを明示的に呼び出す

あるコンストラクターから別のコンストラクターを呼び出すことは、(奇妙なことに)複数のコンストラクターがあり、コンストラクター内で以前に指定された初期化コードを新しいコンストラクターで書き換えたくない場合に便利です。混乱した?すべては見た目ほど怖いものではありません。以下のコードを見てください。これには 2 つのクラス コンストラクターがありますHuman
class Human{
    int age;
    int weight;
    int height;

    Human(int age, int weight){
        this.age = age;
        this.weight = weight;
    }
    Human(int age, int weight, int height){
        //you call the constructor with two parameters
        this(age, weight);
        //and add the missing variable
        this.height = height;
    }
}
int ageここでは、まず、と を 受け入れる 2 つのパラメーターのコンストラクターを用意しますint weight。そこに 2 行のコードを書いたとします。
this.age = age;
this.weight = weight;
そして、年齢と体重に加えて身長も必要とする 3 つのパラメーターを持つ別のコンストラクターを追加することにしました。新しいコンストラクターでは、次のように記述できます。
this.age = age;
this.weight = weight;
this.height = height;
ただし、このコンストラクターで既に記述したコードを繰り返す代わりに、キーワードを使用してthis2 つのパラメーターを指定してコンストラクターを明示的に呼び出すことができます。
this(age, weight);
// and add the missing variable:
this.height = height;
つまり、コンストラクターに 3 つのパラメーターを指定するようなものです。
  • このコンストラクターを呼び出します。このコンストラクターには 2 つのパラメーターがあります。
  • そして不足している変数を追加します。
以上です =)。最後に、Java の this キーワードは、クラス インスタンスのメソッドまたはコンストラクターの一部としてのみ使用されることに注意してください。ただし、キーワードは暗黙的thisに、静的メソッドを除くすべてのメソッドに渡され (そのため、this暗黙的なパラメーターと呼ばれることが多いのです)、メソッドを呼び出したオブジェクトを参照するために使用できます。このキーワードは怖いものではないので、恐れる必要はありませんThis
キーワードこの {例中} - 9
コメント
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION