【问题标题】:Object references pointing to the same object指向同一个对象的对象引用
【发布时间】:2012-11-26 23:44:46
【问题描述】:

假设我们有一个类Board 有很多字段(即一个相当复杂的类)。我们像这样实例化一个 Board:

Board b = new Board();

请注意,为了这个示例,我没有在构造函数中输入任何参数,尽管在实际示例中,这些参数可能是必需的。如果我们要实例化一个新的 Board 实例并将其设置为如下所示:

Board c = b;

这实际上不会创建一个新板。据我所知,cb 现在指向同一个内存区域,同一个 Board 对象。所以,如果我要更改 b 的某些内容,比如增加一个整数字段,如下所示:

b.count++;//Assume count is an integer field in the Board class.

c.count 的值也应该增加。但是,当我自己这样做时,它不起作用。 b.count 增加,但 c.count 不增加。
谁能向我解释为什么会这样?这种效果是我想要发生的,因此任何关于如何实现它的建议都会非常有帮助(一般的例子很好)。

【问题讨论】:

  • 能否请您发布复制它的示例
  • 真的想看看这个例子。
  • 每个答案都有相同的例子......我开始怀疑我是否看不到 OP 问题中的代码。

标签: java class pointers reference


【解决方案1】:

又错了:

package cruft;

/**
 * Board description here
 * @author Michael
 * @link
 * @since 11/26/12 6:46 PM
 */
public class Board {

    public int count;

    public static void main(String[] args) {
        Board b = new Board();
        Board c = b;
        System.out.println("b before: " + b);
        System.out.println("c before: " + c);

        ++b.count;

        System.out.println("b after : " + b);
        System.out.println("c after : " + c);
    }

    @Override
    public String toString() {
        final StringBuilder sb = new StringBuilder();
        sb.append("Board");
        sb.append("{count=").append(count);
        sb.append('}');
        return sb.toString();
    }
}

【讨论】:

  • 技术方面,应该是b.count++;
  • 那你为什么不解释一下++i和i++有什么不同呢?这与这个问题有什么关系?
  • 一个++在变量之前,另一个在变量之后。我想你知道的。我的意思是,如果代码与 OP 完全匹配,那将是一个更好的例子。正如我所说,我不认为这是密切相关的,我认为这是一个技术问题。我没有侮辱你:我完全承认你是多么的出色和无懈可击。
【解决方案2】:

这不应该发生。看看这个例子。

public class Board {

    public Integer count = 0;

    public static void main(String[] args)
    {
        Board b = new Board();
        Board c = b;

        c.count++;

        System.out.println("b.count="+b.count);
        System.out.println("c.count="+c.count);
    }

}

【讨论】:

    【解决方案3】:

    这不会发生在单个线程中。 如果您为第二个线程执行 c=b,则适用正常的可见性规则。

    【讨论】:

      【解决方案4】:

      首先,您应该尽量避免在您的对象中使用public 字段。使用private 字段,然后使用getFieldName()setFieldName(FieldType arg) 方法。这样您就可以更好地控制发生的事情,如果您希望在某个变量发生变化时发生其他事情,您可以添加代码。

      话虽如此,您的代码中一定有错误,因为:

      public static void main(String[] args) {
          Board b = new Board();
          Board c = b;
      
          System.out.println("BEFORE++: b.count = " + b.count);
          System.out.println("BEFORE++: c.count = " + c.count);
      
          b.count++;
      
          System.out.println("AFTER++: b.count = " + b.count);
          System.out.println("AFTER++: c.count = " + c.count);
      }
      
      public static class Board {
          public int count = 0;
      }
      

      输出:

      BEFORE++: b.count = 0
      BEFORE++: c.count = 0
      AFTER++: b.count = 1
      AFTER++: c.count = 1
      

      【讨论】:

        猜你喜欢
        • 2015-02-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-09-19
        • 2020-07-23
        • 2013-07-09
        • 1970-01-01
        相关资源
        最近更新 更多