12

可能重复:
我什么时候应该在课堂上使用“this”?

在引用实例的字段时,如何知道是否使用“this”?

例如:

return this.name

我被教导了一个有用的案例。即当输入参数与字段名称相同时:

public void setName(String name) {
    this.name = name;
}

除此之外,“这个”似乎不需要..还有哪些其他情况?

4

7 回答 7

6

当一个类的构造函数太多时,可以使用this调用其他构造函数。例子 :

public class TeleScopePattern {

    private final int servingSize;
    private final int servings;
    private final int calories;
    private final int fat;

    public TeleScopePattern(int servingSize, int servings) {
        this(servingSize, servings, 0);

    }

    public TeleScopePattern(int servingSize, int servings, int calories) {
        this(servingSize, servings, calories, 0);

    }

    public TeleScopePattern(int servingSize, int servings, int calories, int fat) {

        this.servingSize = servingSize;
        this.servings = servings;
        this.calories = calories;
        this.fat = fat;

    }

}
于 2012-08-16T15:13:18.463 回答
5

您必须在以下几种情况下使用它:

  1. 当您具有相同名称的字段和方法参数/局部变量并且您想要读取/写入该字段时

  2. 当您想从内部类访问外部类的字段时:

    class Outer {
    
        private String foo;
    
        class Inner {
            public void bar() {
                 System.out.println(Outer.this.foo);
            }
        }
    }
    
  3. 当您想从另一个构造函数调用一个构造函数时(但它更像是一个方法调用 -this(arg1, arg2);

所有其他用法只是风格问题。

于 2012-08-16T15:17:47.430 回答
2

Fluent Interface 模式本质上意味着从this“setter”方法返回,允许您“链接”方法调用。

StringBuilder是 JDK 中具有流畅界面的一个示例。以下是它的工作原理:

int count = 5;
StringBuilder sb = new StringBuilder();
String result = sb.append("The total is ").append(count).append(".").toString(); 

上面的最后一行相当于:

sb.append("The total is ");
sb.append(count);
sb.append(".");
String result = sb.toString();

但导致代码更少,并且可以说更具可读性。

各种append()方法的实现都返回this

于 2012-08-16T15:51:05.497 回答
2

除了这种情况(这很常见,我更喜欢以不同的方式命名变量和参数,以便更好地区分它们)以及将其用作构造函数,还有另一种情况。

有时您想将非常实例化的对象传递给方法。在这种情况下,您可以将此用作接收该实例的类的方法的参数。例如,有一个带有辅助类的方法,该类会增加:

public class MyClass {

    private Integer value = 0; //Assume this has setters and getters

    public void incrementValue() {
        Incrementer.addOne(this);
    }

}

而 incrementer 类有一个像这样的方法:

public static void addOne(MyClass classToIncrement) {
    Integer currentValue = classToIncrement.getValue();
    currentValue++;
    classToIncrement.setValue(currentValue);
}

有关更多信息,请查看文档

于 2012-08-16T15:16:16.213 回答
1

在大多数情况下,当从类中引用方法或属性时,这是不必要的。然而,它通过明确变量存储在类范围而不是函数范围中来提高可读性。

于 2012-08-16T15:16:57.337 回答
0

“在实例方法或构造函数中,this是对当前对象的引用——正在调用其方法或构造函数的对象。您可以使用 . 从实例方法或构造函数中引用当前对象的任何成员this。”

阅读此处了解更多信息和一些示例。

于 2012-08-16T15:16:15.370 回答
0

我不知道是谁这样教你的,但据我所知,是对当前对象的引用。

returnType method(dataType val){
dataType myVariable = someOperation(this.val);
return myVariable;
}

docs.oracle.com详细说明了它。

于 2012-08-16T15:33:40.890 回答