我知道这是一个愚蠢的问题,但它真的让我烦恼。
采取以下措施:
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)参数是通过指针而不是值传递的吗?
答案 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中使用的“聪明”机制,实施成本高昂,大多数程序员难以有效使用。
我会远离使用术语“通过指针”。它实际上只是另一种说“指针传递值”的方式......如果你试图将它看作不同的东西,你最终会感到困惑。