我是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
感谢。
答案 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
用变量做一些有趣的事情......你左右两边(为了消除歧义)。
在上面的例子中,被调用者和左边是同一个对象。因此,您得到输出2,1。
test2
略有不同。你只有一个参数,所以它就是“论证”(为了消除歧义)。
因此,您的输出结果为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);
}