帮助我理解这个指针与价值问题

时间:2009-11-20 05:22:48

标签: java pointers

我知道这是一个愚蠢的问题,但它真的让我烦恼。

采取以下措施:

public <TParseable> LinkedList<TParseable> readAllParseable(
            Parseable<TParseable> parseable, boolean close) throws IOException
{
   LinkedList<TParseable> list = new LinkedList<TParseable>();
    byte[] delim = parseable.getDelimiterValue();
    boolean skipNL = parseable.skipNewLines();

    while(ready())
    {
     byte[] data = readTo(delim);
     parseable.parse(data);

     System.out.println(parseable);

     list.add((TParseable)parseable);
    }
    return list;
}

每次调用toString()后,println语句都会输出parseable的预期parseable.parse(data)值。但是,返回的列表具有正确的元素数,但它们都等于循环完成之前的最后一个prseable值。

这是因为list.add(xxx)参数是通过指针而不是值传递的吗?

4 个答案:

答案 0 :(得分:2)

您发布的代码中只有parseable的单个实例。当您调用add(parseable)时,您正在向列表中的parseable添加引用(Java中的“指针”不正确)。

通过反复调用它而不更改parseable引用的对象,您只需在列表中添加对同一对象的更多引用。

新对象只能由new关键字创建。

答案 1 :(得分:0)

每次都将相同的可解析对象放入列表中。每次parseable解析一些数据时,它都使用相同的可解析对象进行处理。

答案 2 :(得分:0)

对象parseable在整个方法中是相同的。我假设当你调用parseable.parse(data)时,它会以可解析的方式更改内部数据。由于您继续将相同的对象放在列表中,因此每次迭代都只对相同的对象进行操作。

答案 3 :(得分:0)

我认为你的概念问题是术语之一。如果我将“价值”改为“状态”,也许这将有助于澄清事情......

  

println语句输出   期望toString()状态的parseable   每次打电话后   parseable.parse(数据)。   但是,返回的列表有   正确的元素数量,但它们   都等于最后的状态   在循环完成之前可以解析。

实际上,您的程序只使用一个Parseable实例,并且该实例上的方法调用正在更改其状态

  

这是因为list.add(xxx)   参数由指针传递   比价值?

没有。这是因为实例的状态(如toString()所示)正在发生变化。

实际上,Java对方法和构造函数调用中的所有参数使用按值传递语义,而不管类型如何。稍微令人困惑的是,在Java中传递Object /数组时传递的“值”是一个引用。

编程语言支持的三种基本参数传递机制是:

  • pass-by-value,其中复制可能是原始值,指针/引用值或(在某些语言中)结构化值的值。 (在某些语言中,值可以在返回时复制回来,但这只是传值的逻辑扩展。)

  • 传递引用,您在调用者中传递变量的地址,允许被调用者更改该变量,和/或查看其他更改变量的结果。

  • 名称传递,这是Algol-60中使用的“聪明”机制,实施成本高昂,大多数程序员难以有效使用。

我会远离使用术语“通过指针”。它实际上只是另一种说“指针传递值”的方式......如果你试图将它看作不同的东西,你最终会感到困惑。