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  = "十万个为什么"时,内存情况

 

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

 

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

 

相信是一目了然了。

 

结论:

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

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

 

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

  • 21
    点赞
  • 41
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值