我有以下代码:
public class Foo {
Bar mineBar;
class Bar {
int a;
public Bar(int a) {
this.a=a;
}
}
Bar getBar() {
return mineBar;
}
void reassingBar() {
//getBar()=new Bar(10); //doesn't work
mineBar=new Bar(10);
}
public static void main(String[] args) {
}
}
问题是,如果getBar()
返回Bar
,为什么我只能使用返回的Bar
并重新分配对新对象的引用?
我想知道它在C ++中是否有所不同?
答案 0 :(得分:1)
它是如何指定Java的。从JLS Sec 15.26开始,作业的语法由下式给出:
Assignment: LeftHandSide AssignmentOperator Expression LeftHandSide: ExpressionName FieldAccess ArrayAccess
因此LHS必须是变量,字段或数组元素。其他任何东西都是无效的语法。
您无法重新分配方法的返回值的原因是Java始终是按值传递的。 "参考"由getBar()
方法返回的Foo.bar
字段不是Foo.bar
字段,它是一个有效的新变量,它也指向与Foo.bar
字段相同的对象。因此,重新分配 变量对Object a = new Object();
Object b = a; // a and b now refer to the same object.
b = new Object(); // This reassigns b, but not a.
字段的值没有影响。
因为那"变量"只有在表达式被评估时才存在,没有必要允许它:你也可以直接使用RHS的值。
它与以下内容没有什么不同:
notification:
build: notify
command: python -u app.py
volumes:
- notify:/notify
links:
- db