什么时候在Java中使用“this”是合适的

时间:2012-08-16 15:08:12

标签: java

  

可能重复:
  When should I use “this” in a class?

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

例如:

return this.name

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

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

除此之外,“这个”似乎不需要..还有什么其他案例?

7 个答案:

答案 0 :(得分: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;

    }

}

答案 1 :(得分:5)

在少数情况下你必须使用它:

  1. 如果您具有相同的字段名称和方法参数/局部变量,并且您想要读/写字段

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

    class Outer {
    
        private String foo;
    
        class Inner {
            public void bar() {
                 System.out.println(Outer.this.foo);
            }
        }
    }
    
  3. 当你想从另一个构建函数中调用一个构造函数时(但它更像是一个方法调用 - this(arg1, arg2);
  4. 所有其他用法只是风格问题。

答案 2 :(得分:2)

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

有些想要将实例化的对象传递给方法。在这种情况下,您将此作为接收该实例的类的方法的参数。例如,使用辅助类进行增量的方法:

public class MyClass {

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

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

}

增量器类有一个像这样的方法:

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

有关详情,请查看the documentation

答案 3 :(得分:2)

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

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

答案 4 :(得分:1)

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

答案 5 :(得分:0)

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

Read here for more info and some examples.

答案 6 :(得分:0)

我不知道是谁以这种方式教你,但据我所知,这个是对当前对象的尊重。

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

docs.oracle.com详细说明了这一点。