几周前我开始接触java。在此之前,我在嵌入式目标上使用 c/c++ 工作,并在 Win PC 上使用带有 UI Stuff 的 c# 工作多年。
我得到了这个非常简单的例子:
public class StreamProcessing {
public static void main(String[] args) {
Stream stream = new Stream(); //after this line: Stream string empty
StreamFiller.fillStream(stream); //after this line: Stream string not empty any more
StreamPrinter.printStream(stream);
}
}
我希望无论 StreamFiller.fillStream() 做什么,参数都会被复制。然而,看起来 fillStream 正在修改实际的流对象本身。Stream 类基本上包含一个字符串
public class Stream {
private String content = "";
int index = 0;
public char readChar() {
if (index < content.length()) {
return content.charAt(index++);
} else {
return 0;
}
}
public void writeString(String str) {
content += str;
}
}
Streamfiller 应该修改它的流副本,而不是原始引用
public class StreamFiller {
public static void fillStream( Stream stream ) {
stream.writeString( "This is a" );
stream.writeString( " stream." );
}
}
如果我错了,请纠正我,但由于字符串类的实际文本是在堆上分配的,因此 StreamProcessing () Stream 对象和 fillStream() 的(假定复制的)本地对象都指向相同的地址堆(是的,我现在它不是像 c/c++ 中那样的实际内存地址,而是一些唯一的对象标识符)
那么我的假设正确吗?非平凡对象(又名在堆上分配的对象)是通过引用传递的吗?
潇湘沐
森林海
相关分类