将非最终对象传递给方法引用

Ste*_* L. 11 java lambda expression-evaluation java-8 method-reference

什么是第二次s.get()返回"ONE"的解释?

String x = "one";
Supplier<String> s = x::toUpperCase;
System.out.println("s.get() = " + s.get());
x = "two";
System.out.println("s.get() = " + s.get());
Run Code Online (Sandbox Code Playgroud)

更新:

比较它:

String x = "one";
Supplier<String> s = () -> x.toUpperCase();
System.out.println("s.get() = " + s.get());
x = "two";
System.out.println("s.get() = " + s.get());
Run Code Online (Sandbox Code Playgroud)

它会抛出一个编译错误.

nit*_*.kk 5

在java变量中,引用对象通常称为references.在上面的代码中,您有两个引用,xs.

字符串是不可变的,任何更改都代表另一个对象.创建后,您无法修改String对象的任何状态.

在代码都xs被initilized指2个对象,然后x被制成参阅另一个目的,但s仍是指相同的对象.请注意,::会立即评估并生成对象.x可以独立于其他对象更改其引用y

x = "two"仅使用make x来引用不同的对象.


ΦXo*_*a ツ 3

String 是一个不可变的类,你正在做

x = "two"; 
Run Code Online (Sandbox Code Playgroud)

使对象保持“完整” 并保留先前的值“ONE”