区分按值复制和按引用复制的实例/对象

时间:2014-07-22 06:27:44

标签: java

我正在为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类,其对象/实例的行为与此类似。但是,当作为参数传递给方法时,它们的参考值将被传递。

所以我的问题是,有没有办法找到对象总是使用按值复制行为的所有特殊情况?我怎样才能找到所有这些课程?这可能不是一件容易的事,欢迎提出任何建议。感谢。

1 个答案:

答案 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"

    }