重新分配方法返回的引用

时间:2017-04-15 20:16:07

标签: java c++

我有以下代码:

 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 ++中是否有所不同?

1 个答案:

答案 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