java之方法参数的引用传递(浅析)

算是比较基础的东西

(如果看着累可以直奔结论)

先上代码1:

public class Quote1 {
	// 引用不会改变变量,即形参不会改变主方法中的实参
	public static void main(String[] args) {
		int i = 0;
		function1(i);
		System.out.println(i);
		
		String str = "李白";
		function2(str);
		System.out.println(str);
	}
	
	public static void function1(int i) {
		i = 5;
	}
	
	public static void function2(String str) {
		str = "杜甫";
	}
}

我们在主方法中定义变量i,赋值0.并执行function1()

我们可以看到在function1中我们对i进行了赋值

下面的function2类似,是对字符串进行赋值

输出如下:

0
李白

原理:

方法中的参数列表是形参,和主方法中的变量(i和str)没有关系。

以此程序的function1为例,我们用更通俗易懂的方法来解释:主程序中的function1(i),相当于function1(0),function1(i)只是相当于把5作为参数传过去执行方法,而方法中的参数不会导致主方法中的变量有所改变。

function2(str)同理。

再上代码2

import com.oracle.entity.Book;

public class QuoteBook {
	// 地址的引用改变后会影响主方法中的关于地址的引用
	// 由于Book是一个实体类,所以对于function1在形参中的引用也会指向对应地址
	// 而function2多加了一条语句,使用new在堆中开辟了一个新的空间,致使地址引用改变,不再指向主方法中的Book的地址
	
	public static void main(String[] args) {
		Book book = new Book();
		
		book.name = "十万个为什么";
		function1(book);
		System.out.println(book.name);
		
		function2(book);
		System.out.println(book.name);
	}

	private static void function1(Book book) {
		book.name = "百万个为什么";
	}
	
	private static void function2(Book book) {
		book = new Book();
		book.name = "千万个为什么";
	}
}

这里解释一下,book是一个实体类,这里只用到了book的name属性。

而输出是这样的:

百万个为什么
百万个为什么

其实也不难理解,上几张图即可了解。

图1:执行到 book.name  = "十万个为什么"时,内存情况

扫描二维码关注公众号,回复: 2711344 查看本文章

图2:执行完function1后,内存情况:

图3:执行完function2后,内存情况:

相信是一目了然了。

结论:

引用不会改变已声明并定义的变量,即形参不会改变主方法中的实参

地址的引用改变后会影响所有关于地址的引用

如果有哪里不对还请大佬指正,谢谢

猜你喜欢

转载自blog.csdn.net/qs395517243/article/details/81545900