代码之家  ›  专栏  ›  技术社区  ›  WolfmanDragon

StringBuffer如何通过类中没有字段的空隙传递数据?

  •  1
  • WolfmanDragon  · 技术社区  · 16 年前

    public String bigString()
        {
            StringBuffer bob = new StringBuffer();
            this.littleString(bob);
            return bob.toString();
        }
    
    private void littleString(final StringBuffer bob)
        {
            bob.append("Hello, I'm Bob");
        }
    

    littleString方法不应将StringBuffer传递回,但仍然是。这里有什么黑魔法?这打破了我所知道的所有封装规则。我很震惊,说不出话来。

    4 回复  |  直到 14 年前
        1
  •  7
  •   Adam Rosenfield    16 年前

    littleString 不是将对象传回——它只是使用同一个对象。两者都是局部变量 bob 在里面 bigString() 参数呢 在里面 littleString() 引用同一对象,因此如果更改其中一个对象,则更改将立即显示在另一个对象中 因为它们都是对同一个对象的引用 .

    问题是 StringBuffer String s) 是不可变的,所以您可以安全地将它们作为方法参数传递,并且您知道它们永远不会被修改。请注意,添加 final 关键字在这里没有帮助--它只是确保 从不被指定引用不同的 对象

        2
  •  1
  •   Chuck    16 年前

    它没有把任何东西传回去。它正在修改您传递引用的StringBuffer。Java中的对象不是按值传递的。

        3
  •  1
  •   mweiss    16 年前

    如果您的意思是为什么要修改字符串缓冲区,那是因为您传递了对字符串缓冲区的引用,这允许您调用修改字符串缓冲区对象的公共方法append。

        4
  •  0
  •   Chii    16 年前

    上面的答案基本上是正确的,只是有一点没有提到:java缺少“const ness”,这意味着您希望对象不可修改。

    “最终”很接近,但它仍然不能很好地完成任务。代码片段显示的是,如果将可变对象作为参数传递给其他方法,则可能发生的错误类型。这可以通过使用不可变的对象来解决,或者如果为deep const添加了某种新的关键字,也可以解决。