关于返回值是参考

时间:2018-01-25 12:39:50

标签: java

看看这个例子:

2>&1 | echo 2>&1 | grep 'Word:' | sed -e ...

我从 Thinking In Java 中简化了它。当我使用引用public class Leaf{ Leaf increment(); public static void main(String[] rags){ Leaf x = new Leaf(); x.increment().increment(); } } 来调用方法x时,返回值是一个引用,但它永远不会被赋值。为什么它能够直接调用第二个增量?

如果那条线是这样的话我很容易理解:

increment

1 个答案:

答案 0 :(得分:1)

increment()返回一个对象,该对象是Leaf类的实例,而作为Leaf实例的每个对象都可以在其上调用该方法。您不必将其分配给变量,它已保留在内存中,并且以下方法调用将对第一个increment()方法调用返回的引用起作用。

你可以像这样隔离它:(leaf.increment()).increment(),当第一个方法完成时,它将返回新的叶子对象,它将在其上调用第二个方法。事实上它就像这样(returnValueOfFirstIncrement).increment()

您是否想要将第一个方法调用的结果值分配给变量是您的选择,但无论如何都会返回该对象,即使不将其分配给变量也可以使用它。

我的措辞可能不是最好的,但我尽量解释它。

EDIT;

评论你的问题的人已经举了一个很好的例子,为什么会这样。

1 + 2 + 3等于myInteger1.add(myInteger2).add(myInteger3)请记住,java Integer不包含add方法,它是隐式的,所以要理解这个例子,想象myIntegers是具有这种方法的虚构MyInteger类的所有实例。 < / p>

myInteger1.add(myInteger2)将返回等于new MyInteger(3)的值。这将保留在内存中的某处并引用内存中保留的对象将被返回。所以myInteger1.add(myInteger2)等于该片段的返回值new MyInteger(3),使其看起来像(new MyInteger(3)).add(myInteger3)。编译器将逐个解析方法,并使用每个方法的返回值来解决下一个方法,例如,方法被链接。