27

次のようなことを試みると、Eclipse は「代入の左側は変数でなければなりません」というエラーを出します。

public class Thing{

  String a1;
  int a2;

  public void meth(){
    Thing A = new Thing();
    this = A;
  }
}

this.a1 = A.a1; this.a2 = A.a2;回避策として、各変数 ( ) を割り当てる必要がありました。

各変数フィールドを通過せずにこれを行う他の方法はありますか?
が変数でない場合、thisそれは何と呼ばれますか?

4

12 に答える 12

72

thisオブジェクトの現在のインスタンスを指す疑似変数であり、再割り当てすることはできませんまた、Java 言語仕様のセクション3.9によると、言語のキーワードと見なされます。

于 2012-12-12T20:40:15.627 に答える
24

いいえ、簡単な近道はありません。

そして、「これ」が変数でない場合、それは何と呼ばれますか?

thisは変数ではなく、キーワードです。

は特別ですthisが、多くの点で参照のように機能します。したがって、一貫性を保つためthis = Aに、参照代入を行う必要がありますが、これはあまり意味がありません。

からへthis = Aのフィールドごとのコピーを実行することを期待しているようですが、実際、この場合、Java の設計者はそれを行うことを選択できます。ただし、これは他の参照割り当てと矛盾する可能性があり、これを例外として持つことの全体的な利点はまったく明確ではありません.Athis

于 2012-12-12T20:40:04.910 に答える
10

thisthisクラスのインスタンスを参照します。

に割り当てることはできませんthis

于 2012-12-12T20:40:08.717 に答える
9

これは、現在のオブジェクトを参照する Java の予約済みキーワードです。変数ではなく、Java の予約済みキーワードです。this = A;無効です。キーワードを使用しthisて、現在のオブジェクトの任意のインスタンス変数またはメソッドを参照できます。次のようなインスタンス変数を参照する必要があります。

this.a1 = A.a1;

ドクから

this キーワードを使用する最も一般的な理由は、フィールドがメソッドまたはコンストラクターのパラメーターによって隠されているためです。

于 2012-12-12T20:40:14.457 に答える
6

thisJava でに割り当てることはできません。これは変数ではありません。キーワードです。

特定のインスタンスが必要ない場合に考慮すべきことの 1 つはreturn、新しいインスタンスを単に ing することです。

public class Thing{

  String a1;
  int a2;

  public Thing meth(){
    Thing A = new Thing();
    return A;
  }
}

そして、あなたはそれを次のように使用します

whatever = whatever.meth();
于 2012-12-12T20:41:41.530 に答える
5

Java lang仕様§15.8.3 によると、またはステートメントのいずれかでthisあるキーワードです

  1. プライマリ式 として使用される場合this、インスタンス メソッドが呼び出されたオブジェクトへの参照である値を示します。
    • 式:値に評価されるもの。例: x++
  2. キーワード this は、特別な明示的なコンストラクター呼び出しステートメントでも使用されます
    • ステートメント:プログラムの実行を制御する構文要素で、その効果のために実行され、値を持たないもの 例: if (true)

どちらの場合も変数ではありません

  • 変数:タイプが関連付けられたストレージの場所

あなたの場合this変数ではなくです。しかし、すべての意図のために、目的はそれをキーワードと呼ぶだけです

  • キーワード: ASCII 文字から形成された文字シーケンスは、使用のために予約されています ... 変数名として使用することはできません
于 2012-12-13T04:07:39.873 に答える
1

OPは、「this」ポインターに新しい値を割り当てるのではなく、あるオブジェクトの内容を別のオブジェクトに割り当てる機能を求めていると思います。C++ にはこの機能があり、代入演算子をオーバーライドできますが、Java にはそのような機能がありません。

場合によっては便利な機能ですが、現時点では不可能であり、将来的に機能を提供する Java の「型」には適合しません。

Javaがオブジェクトを他のオブジェクトに埋め込むことを許可した場合(単に参照された埋め込みに対して)、この機能はより便利になります(そしてそれを提供する動機がより大きくなります)が、それもカードにはありません。

于 2012-12-13T01:40:41.333 に答える
1

thisメソッドの所有者を指します。この場合、所有者はオブジェクトそのものです。

場合によってthisは、コードを記述しているクラスを参照しないことがあります。迷惑なクラスなど。一般的な例は匿名リスナーです。

 button.addActionListener(
        new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                this; // refers to the ActionListener
            }
        }
    );

また、返品this可能ですmethod chaining。Homework というクラスがあり、メソッド addTask があるとします。

public Homework addTask(String task){
return this;
}

次のようにaddTaskメソッドを呼び出すことができます

homework.addTask("a").addTask("b").addTask("c");
于 2012-12-12T20:50:28.717 に答える
0

基本的なJava言語で、あるインスタンスから別のインスタンスにすべてのフィールドの値をコピーする1つの方法はありません。そして、あなたは通常それを必要とすべきではありません。ほとんどの場合、新しいインスタンスへの参照を置き換えるか、ターゲットインスタンスで直接作業できます。

オブジェクトのすべてのフィールドを初期値にリセットしたい場合(そしてそれが必要になることはめったにありません)、通常、8がそれ自体のインスタンスで機能するか、特定のオブジェクトで機能する静的な方法であるリセットメソッドを使用します。 。

それで

class A {
  String a1; int a2;
  void reset() { a1 = ""; a2 = 0; }
}

として使用されます

A a = new A();
// modify a
a.reset();

class A {
  String a1; int a2;
  static void reset(A anotherA) { anotherA.a1 = ""; anotherA.a2 = 0; }
}

次のように使用します。

A.reset(a);

どちらの場合も、コンストラクターで初期値を設定するためにもresetメソッドを使用するのが理にかなっています。A() { A.reset(this); }またはA() { this.reset(); }

1実際には、それを行うためのライブラリがいくつかあり、リフレクションの助けを借りてコーディングできます。これが使用されているのは、clone()メソッドを実装するため、またはある種のラッピング/スタブのためだけです。

于 2012-12-13T01:31:57.043 に答える
0

あなたがやろうとしているのは、オブジェクトを再初期化するメソッドを持っているように思えます。つまり、オブジェクトを初期値に戻します。新しいオブジェクトを作成し、それを現在のオブジェクトに割り当てたいのはそのためですよね?

その場合は、別の方法を試してみましょう。前述のとおり、 を再割り当てすることはできませんthis

それを行う代わりに、次のようなことを試してみたらどうでしょうか:

public class Thing {

    String a1;
    int a2;

    public Thing() {
        this.meth();
    }

    public void meth() {
        this.a1 = "a1";
        this.a2 = 2;
    }

}

このように、 Thing.meth() は実際にオブジェクトを初期化し、コンストラクターはオブジェクトの作成時にそれを呼び出します。その後、いつでも呼び出すことができます。

于 2012-12-13T02:55:50.630 に答える
0

==免責事項、私はJavaを知りません==

手動で割り当てたいと思うでしょう。

Thing 内に Thing の新しいインスタンスを作成しようとしている理由はわかりませんが、a1 と a2 の値を設定していないため、同じように割り当てる必要があります。

これは、内部にあるクラス オブジェクトを指す予約済みのキーワードです。

たとえば、fish() という名前の別の関数が必要な場合、コードは次のようになります。

public class Thing{

  String a1;
  int a2;

  public Thing meth(){
    Thing A = new Thing();
    return A;
  }

  public Thing fish(){
    this.a1 = "foo";
    this.meth();
    return A;
  }
}
于 2012-12-13T03:59:24.290 に答える
0

あなたがそうするとき、あなたは現在のthis = stuff;オブジェクトインスタンス参照(この場合、コンストラクターで初期化しているもの)を別のものに置き換えようとしています.(Javaの特定のケースでは)それは違法であり、言語はあなたが行うことを禁じていますそれ。

考えてみてください。現在のインスタンスへの参照をそのように置き換えることができた場合、深刻なメモリとセキュリティの問題が発生する可能性があります (構築されたオブジェクトへの参照が失われ、不明なオブジェクトによって上書きされます)。

完全に有効なのは、演算子を使用して現在のオブジェクトのメンバーを参照する.ことです。それらは によって所有されているthisため、問題は発生しないはずです (少なくとも明白なものではありません)。

JVM には、簡単なバイナリ操作を防ぎ、言語構文によって強制されるいくつかの内部セキュリティ対策 (たとえば、メソッドの最大スタック サイズの検証、クラス ファイル形式の検証など) があります。これはその一つと見ることができます。

于 2012-12-13T04:31:44.187 に答える