/**对象引用(地址引用)和值引用的区别 ,画图就清楚了*/
引用时是值引用的数据类型,比如int,short,long,byte,float,double,char,boolean,其它都是对象引用。
public static void main(String[] args) {
String str1 = "string interning"; // string literal会被自动”扣留“
String str2 = new String(str1); // 这时产生了两个内容相同的String对象
System.out.println(str1 == str2);// 输出false
str2 = str2.intern(); // 这时 str1 和 str2 指向的是同一个String对象,
/*
* 补充介绍一点:String.intern();存在于.class文件中的常量池,在运行期间被jvm装载,并且可以扩充。
* String的intern()方法就是扩充常量池的一个方法;当一个String实例str调用intern()方法时,
* java查找常量池中是否有相同unicode的字符串常量,如果有,则返回其引用,如果没有,
* 则在常量池中增加一个unicode等于str的字符串并返回它的引用。
*/
System.out.println(str1 == str2); // 输出true
StringBuffer s = new StringBuffer("good");
StringBuffer s2 = new StringBuffer("bad");
test(s, s2);
System.out.println(s);// goodhah
System.out.println(s2);// bad
/*
* 关于s和s2运行结果说明: s2并没有被增加,因为引用的时候 x去引用的是s3 而y至始至终引用的是s,增加的时候也是 s对象,所以test中y是输出goodhaha,
* x = new StringBuffer("new");的时候就已经开辟了一个新的区域,存放new
* 指引在这个时候已经被改变了,所以实参s也改变成goodhah
*
*/
}
static void test(StringBuffer x, StringBuffer y) {
System.out.println("Start entering the test method:");
// System.out.println(x);// good
// System.out.println(y);// bad
y = x;
x = new StringBuffer("new");
// System.out.println(x);// new
System.out.println(y);// good
x.append("hah");
y.append("hah");
System.out.println(x);// newhah
System.out.println(y);// goodhah
System.out.println("End test method.");
}