我正在为Java
程序编写静态分析工具。例如,在分配赋值运算符期间,我想知道底层对象是使用按值复制还是按引用复制。
对于原始数据类型,我知道,变量使用按值复制。
int x = 5;
int y = x; // Both are pointing to independent memory locations.
如果是对象,通常会复制其他对象的引用值。例如,
MyClass obj1 = new MyClass();
MyClass obj2 = obj1; // Both instances pointing to the same memory location.
但是,在特殊情况下,例如
String str1 = "myString";
String str2 = str1; // Both pointing to independent memory locations.
str1 = null; // Only str1 gets null
在我看来,对象使用copy-by值。如果我错了,请纠正我。类似地,使用StringBuilder
关键字声明的java/lang/*
和其他final
类,其对象/实例的行为与此类似。但是,当作为参数传递给方法时,它们的参考值将被传递。
所以我的问题是,有没有办法找到对象总是使用按值复制行为的所有特殊情况?我怎样才能找到所有这些课程?这可能不是一件容易的事,欢迎提出任何建议。感谢。
答案 0 :(得分:1)
对于:
String str1 = "myString";
String str2 = str1; // Both pointing to independent memory locations. NO!
str1 = null; // Only str1 gets null
考虑这个例子:
public static void main(String[] args) {
String s1 = "hello";
String s2 = s1;
System.out.println(s2 == s1); // true . Both pointing to same location
s1=null; // s2 still points to "hello"
}