对象引用和值引用的区别

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/m0_37721946/article/details/78340584

/**对象引用(地址引用)和值引用的区别 ,画图就清楚了*/

引用时是值引用的数据类型,比如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.");
	}

   


阅读更多

没有更多推荐了,返回首页