当使用“return this”时,什么是返回类?

What is returning class when use "return this"?

提问人:blekione 提问时间:3/20/2014 更新时间:3/21/2014 访问量:942

问:

我开始学习 Java,但我无法理解“Thinking in Java”书中的一个例子。 在这个例子中,作者表示,正如他所说,“'this'关键词的简单使用”:

//Leaf.java
//simple use of the "this" keyword

public class Leaf {
    int i = 0;
    Leaf increment() {
        i++;
        return this;
    }
    void print() {
        System.out.println("i = " + i);
    }
    public static void main(String[] args) {
        Leaf x = new Leaf();
        x.increment().increment().increment().print();
    }
}

当上面的代码确实工作时,我无法理解返回的方法是什么。increment()

它不是变量,它不是对象?我只是不明白。我试图修改程序以理解它(例如替换为或代替),但编译器显示错误。ixreturn thisreturn iprint xi

爪哇岛

评论

2赞 Whymarrh 3/20/2014
这是实现 Fluent 接口的一种方法。
0赞 fge 3/20/2014
this始终引用当前实例。例如,您可以写 而不是 in .this.iiincrement()
2赞 Pshemo 3/20/2014
也许将帮助您理解关键字。this
0赞 blekione 3/20/2014
感谢您的重播@Whymarrh,但请注意,我刚刚开始学习 Java,我想要更多“新手”解释。我试图通过那篇 wiki 文章,但对我来说这听起来像是 chainees
0赞 blekione 3/20/2014
@Pshemo我重新引用了你的参考资料,之后我认为使用会降低代码的可读性,至少对于像我这样的新手来说是这样。我想我现在明白了一点this

答:

2赞 Juned Ahsan 3/20/2014 #1
return this;

将返回当前对象,即用于调用该方法的对象。在本例中,将返回类型的对象。xLeaf

评论

0赞 blekione 3/20/2014
这就是我所坚持的,但为什么要用 System.out.println(“i = ” + x);不起作用?
0赞 Brendan Lesniak 3/20/2014
您的 Leaf 类将需要一个方法toString()
0赞 Juned Ahsan 3/20/2014
@FlenMK在这里再次使用它。使用 System.out.println(“i = ” + this.i);
0赞 cHao 3/20/2014
@FlenMK:因为值不是变量。该对象可以同时拥有数万亿个不同名称中的任何一个(给定足够的内存来运行这么大的程序)。它不知道你用哪个名字来称呼它。
0赞 developerwjk 3/20/2014
x 仅存在于 main 函数中,而 i 是该类的成员。您需要阅读范围。
0赞 developerwjk 3/20/2014 #2

this表示从中调用该方法的类的实例。因此,return 意味着返回该类的这个实例。因此,正如返回类型所示,increment() 方法返回 a 并且返回调用 increment() 方法的实例。thisLeaf

这就是为什么您可以致电:

x.increment().increment().increment().print();

因为每次调用你都会得到另一个 Leaf,你可以再次调用 Leaf 中的所有方法。.increment()

0赞 Brendan Lesniak 3/20/2014 #3

this是引用当前实例的关键字。当你用它创建你的第一个实例时,它会创建一个单一的实例LeafLeafLeaf leaf = new Leaf ()Leaf

从表面上看,您将返回正在调用的实例Leafincrement()

0赞 fastcodejava 3/20/2014 #4

return this;返回它所操作的类的实例。因此,每次调用 is 都会返回相同的实例,然后再次调用。您可以继续拨打:increment()incrementincrement()

x.increment().increment().increment().increment().increment().increment()...

评论

1赞 blekione 3/20/2014
所以这就像我会写方法一样,而不是上面?incrementvoid increment() {i++}main()x.increment; x.increment;...