看看这个例子:
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
答案 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)
。编译器将逐个解析方法,并使用每个方法的返回值来解决下一个方法,例如,方法被链接。