通过方法返回的重新选择参考

Reassign reference returned by a method

本文关键字:选择 参考 新选择 方法 返回      更新时间:2023-10-16

我有以下代码:

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

这只是指定Java的方式。从JLS SEC 15.26来看,作业的语法由:

给出:
Assignment:
    LeftHandSide AssignmentOperator Expression
LeftHandSide:
    ExpressionName 
    FieldAccess 
    ArrayAccess

因此,LHS必须是变量,字段或数组元素。其他任何内容都是无效的语法。

您不能重新分配方法的返回值的原因是,Java始终是按价值传递的。getBar()方法返回的"引用"不是Foo.bar字段,它是一个有效的新变量,也指向与Foo.bar字段相同的对象。因此,重新分配变量对Foo.bar字段的值没有影响。

,由于该"变量"仅在评估表达式时才存在,因此允许它没有意义:您不妨直接使用RHS的值。

与以下内容没有什么不同:

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.