-4

我是Java新手,对以下程序的结果感到非常困惑,有人可以详细说明交换场景吗?

另外,有人可以给我几个关于this关键字的例子吗?

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

谢谢。

4

5 回答 5

1

首先,不是this方法。它是一个关键字 它总是引用它被引用的当前对象。它的用法有不同的上下文:

  • 如果在字段名称前面使用它,则它引用特定于该对象的字段名称。

    下面的例子。 fooField在构造函数中会隐藏该字段,但由于我们使用this,我们指的是特定Foo对象的字段。

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

    除非必须,否则不要使用它。它可能导致混乱和不必要的模棱两可的代码。

  • 如果它被用作构造函数的一部分,那么它会调用类中的另一个构造函数。这称为显式构造函数声明。的用法this必须是构造函数声明中的第一个调用。

    下面的例子。这里我有两个不同的构造函数Point,我可以通过调用不带参数调用一个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用它的变量做了一些有趣的事情......你需要左右两侧(为了消除歧义)。

  • 您为被调用者分配左侧的值。// P1.i = 1
  • 左边现在取右边的值。// P1.i = 2
  • 权利采用被调用者的价值。// P2.i = 1

在上面的例子中,被调用者和左边是同一个对象。因此,您会得到输出 2,1。

test2略有不同。您只有一个论点,因此它将是“论点”(为了消除歧义)。

  • 您明确地将被调用者的值重新分配给它自己。// P1.i = P1.i == 2
  • 您将参数的值分配给被调用者。// P1.i = 1
  • 您将被调用者的值分配给参数。// P2.i = 2

因此,您的输出结果为 1,2。

于 2013-04-10T06:17:34.740 回答
0

this 关键字引用类的当前实例。您还可以使用“this”创建在每次调用后返回对象的方法。这对于类配置器很有用。

使用示例:

public class SomeCLass {

//some fields

//some constructors

    public SomeClass setWidth(width) {
        this.width = width;
        return this;
    }

    public SomeClass setLength(length) {
        this.length = length;
        return this;
    }
}

public class Execute {

    public static void main(String[] args) {
        (new SomeClass()).setWidth(10).setLength(15);
}
于 2013-04-10T07:19:16.710 回答
0

this is a reference to the current object

The most common reason for using the this keyword is because a field is shadowed by a method or constructor parameter.

You can use this as a constructor -> this()

this() is a reference to another constructor in the same class

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 回答
0
void test1(P p1, P p2) {    
        int i = p1.i;
        p1.i = p2.i;
        p2.i = i;;
}

此方法可以是static因为它只是交换值而不依赖于实例。

void test2(P p2) {    
        int i = this.i;
        this.i = p2.i;
        p2.i = i;
}

这里this.i指向您调用test2方法的对象,在您的情况下,它是p1并且您p2作为参数传递,它也执行相同的交换操作。

因此,这两种方法都做同样的事情:

您从值 1,2 -- After test1()--> 2,1 -- After test2()--> 1,2 开始。

于 2013-04-10T06:01:21.983 回答
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 回答