java - “this”语句的解释

时间:2013-04-10 05:58:23

标签: java

我是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

感谢。

5 个答案:

答案 0 :(得分:1)

首先,this is not a method. It is a keyword.它始终引用它所引用的当前对象。它的用法有不同的背景:

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

    以下示例。构造函数中的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。

答案 1 :(得分: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);
}

答案 2 :(得分: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你从哪里开始。

答案 3 :(得分: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.
} 

答案 4 :(得分:0)

此关键字指的是当前的类实例。 您也可以使用'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);
}