JavaRush では、学生は最初の講義から文字通りキーワードを学びます
そして、このメソッドから変数に値を代入するだけであることがわかります
つまり、
以下は、キーワードを含むプログラム コードです
this
。そして時間が経つにつれて、それが何を意味するかが明らかになります。しかし、多くの人は、振り返ってみると、長い間、このキーワードの禅を実現できなかったと正直に自分に言うでしょう。this
この記事では、キーワードの使い方がまだ分からない人のために、キーワードの使い方の秘密のベールを解きます...ようこそ! Schildt の Java参考書を手に取ると、171 ページに、this
メソッドがそれを呼び出したオブジェクトを参照できるようにキーワードが必要であることが書かれています。実はこれで終わりなのかもしれない。しかし、詳細が必要です。 原則として、次の 2 つの場合に使用するthis
必要があります。
- クラスインスタンス変数とメソッド/コンストラクタ変数が同じ名前の場合。
- ある型のコンストラクター (デフォルトまたはパラメーター化されたコンストラクターなど) を別の型から呼び出す必要がある場合。これは、明示的なコンストラクター呼び出しとも呼ばれます。
例 1 - インスタンス変数とメソッド変数が同じ名前である
Human
「name」フィールドが定義されている クラスがあるとします。 変数のセッターを作成しましょうname
(セッターは非常に機能しており、ここにはトリックはありません): 変数をメソッド (セッター) に渡していることに注意してください。 )。新しい変数を導入しました。この変数はメソッドの {中括弧} 内でのみ表示されるため、(一般に) 任意に呼び出すことができます。セッターに次の 1 行があることに注意してください。 setName
String newName
setName
name = newName;
つまり、実際には、新しい変数を導入しnewName
、それをクラス内にすでに存在する変数に割り当てましたname
。多くのプログラマーは、結局同じことを話しているのに、新しい名前の変数を導入するのは奇妙だと考えました。クラス内での名前についてHuman
。したがって、言語開発者は、1 つの変数名を使用することを便利にすることを考えました。言い換えれば、同じことを意味する変数になぜ 2 つの名前があるのかということです。つまり、次のようなことをしたいのですが、 この場合、問題が発生します。これで、同じ名前の 2 つの変数ができました。1 つはString name
クラスに属しHuman
、もう 1 つはString name
そのメソッドに属しますsetName
。したがって、Java マシンは、セッターに文字列を記述するときに、どの変数を意味するのかを認識できません。
name = name;
name
Java はメソッドから 最も近いものを取得しますsetName
。
name
。もちろんそれは意味がありません。name
したがって、クラスの変数とメソッドのHuman
変数を区別する何らかの方法が必要でした。この問題を解決するために、キーワードが導入されました。この場合、メソッドではなく変数を呼び出す必要があることを示します。クラスの: name
setName
this
Human
this
記事の冒頭で述べたように、呼び出し元のオブジェクトを参照します。その結果、作成されたオブジェクトにはセッターを介して人の名前がsetName
設定されます。以下はキーワードを使用しないコードですthis
。このコードはクラス オブジェクトを作成しHuman
、名前を付けます。
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;
ただし、このコンストラクターで既に記述したコードを繰り返す代わりに、キーワードを使用してthis
2 つのパラメーターを指定してコンストラクターを明示的に呼び出すことができます。
this(age, weight);
// and add the missing variable:
this.height = height;
つまり、コンストラクターに 3 つのパラメーターを指定するようなものです。
- このコンストラクターを呼び出します。このコンストラクターには 2 つのパラメーターがあります。
- そして不足している変数を追加します。
this
に、静的メソッドを除くすべてのメソッドに渡され (そのため、this
暗黙的なパラメーターと呼ばれることが多いのです)、メソッドを呼び出したオブジェクトを参照するために使用できます。このキーワードは怖いものではないので、恐れる必要はありませんThis
。
GO TO FULL VERSION