-4

I am new to Java, really confused about the outcome of the following program, could someone please elaborate on swapping scenarios?

Also, could someone give me few examples with regards to this keyword?

class P {
    int i;

    void test1(P p1, P p2) {

        int i = p1.i;
        p1.i = p2.i;
        p2.i = i;;
    }

    void test2(P p1) {

        int i = this.i;
        this.i = p1.i;
        p1.i = i;
    }

    public static void main(String[] args) {
        P p1 = new P();
        P p2 = new P();
        p1.i = 1;
        p2.i = 2;
        p1.test1(p1, p2);
        System.out.println(p1.i + "," + p2.i);
        p1.test(p2);
        System.out.println(p1.i + "," + p2.i);
    }
}
//Output
2.1
1.2

Thanks.

4

5 に答える 5

1

まず、メソッドでthisはありませんキーワードです。 参照元の現在のオブジェクトを常に参照します。その使用にはさまざまなコンテキストがあります。

  • フィールド名の前で使用されている場合は、そのオブジェクトに固有のフィールドの名前を参照しています。

    以下の例。 fooFieldコンストラクターの はフィールドを隠しますが、 を使用しthisているため、特定Fooのオブジェクトのフィールドを参照しています。

    public class Foo {
        private String fooField;
    
        public Foo(String fooField) {
            this.fooField = fooField;
        }
    }
    

    必要がない限り、これを使用しないでください。紛らわしく、不必要にあいまいなコードになる可能性があります。

  • コンストラクター コンストラクトの一部として使用されている場合は、クラス内の別のコンストラクターを呼び出します。これは、明示的なコンストラクター宣言と呼ばれます。の使用はthis、コンストラクタ宣言の最初の呼び出しである必要があります。

    以下の例。ここでは、 に対して 2 つの異なるコンストラクターがPointあり、 を呼び出すことで、引数なしで 1 つを呼び出すことができますthis(0, 0, 0)

    public class Point {
        private int x, y, z;
    
        public Point() {
            this(0, 0, 0);
        }
    
        public Point(int x, int y, int z) {
            this.x = x;
            this.y = y;
            this.z = z;
        }
    }
    

さて、あなたのプログラムがその出力を生成する理由について。

test1は変数を使って面白いことをします...左と右の 2 つの側面を取ります (あいまいさをなくすため)。

  • 呼び出し先に左の値を割り当てます。// P1.i = 1
  • 左辺は右辺の値を取るようになりました。// P1.i = 2
  • 右は呼び出し先の値を取ります。// P2.i = 1

上記の場合、callee と left は同じオブジェクトです。したがって、出力は 2,1 になります。

test2は若干異なります。引数は 1 つしかないため、それが「引数」になります (あいまいさをなくすため)。

  • 呼び出し先の値をそれ自体に明示的に再割り当てします。// P1.i = P1.i == 2
  • 引数の値を呼び出し先に割り当てます。// P1.i = 1
  • 呼び出し先の値を引数に割り当てます。// P2.i = 2

したがって、出力は 1,2 になります。

于 2013-04-10T06:17:34.740 に答える
0

「this」は、それ自体を指すポインタです。メソッドは、それを呼び出したオブジェクトを参照する必要がある場合があります。これを可能にするために、Java は「this」キーワードを定義します。さらに、「this」は、現在のオブジェクトを参照するために任意のメソッド内で使用できます。

たとえば。メソッド displayName() がある場合

displayName()
{
 System.out.println("Name: " + name);
}

今、オブジェクト f1 でそれを呼び出しています

f1.displayName() //compiler converts this thing in displayName(f1)

そしてdisplayName()メソッドでは、このようにオブジェクトf1を収集します

displayName(this)
{
 System.out.println("Name: " + this.name); //here this.name means its referring to class member variable.
} 
于 2013-04-10T06:16:25.713 に答える
0

this現在のオブジェクトへの参照です

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

コンストラクターとして使用できますthis->this()

this()同じクラス内の別のコンストラクタへの参照です

public Rectangle() {
    this(0, 0, 0, 0); // calls the constructor below
}

public Rectangle(int width, int height) {
    this(0, 0, width, height);
}
于 2013-04-10T05:59:49.033 に答える