Java:按值传递or按址(按引用)传递?

作者依旧尽量用白话和简洁的代码,希望帮到更多人

首先,我们来了解一下什么是按址传递与按址(引用)传递

按值传递:

将方法A中参数的值传递给一个新方法B,这个新方法B更改这个参数的值不会影响到方法A中参数的值                   

有点拗口,举个例子更好让大家了解:

你将一个word文档发给你的朋友,不论他怎样去修改这个文档,你计算机中的这个word文档都不会发生变化。

按址(引用)传递:

将方法A中参数存储的地址传递给新方法B,即A、B中的这两个参数共同指向同一个存储区域,B方法中通过地址改变对应存储区域的内容,此时方法A中想要读取这个存储区域内容时,这个存储区域已经发生了变化

同样举个例子:

你在一个数据库内建立了一个文件,告诉你的朋友这个文件所在的目录和这个文件的文件名,如果你的朋友也有修改权限的话,它可以将这个文件修改,当你去看的时候看到的是他修改过后的文件

那么,java是按值传递还是按引用传递呢?

Java只有值传递

1、参数为基本类型

多说无益,上代码

public class Test {
	public static void main(String[] args) {
		int a=0;
		change(a);
		System.out.println(a);
	}
	public static void change(int a){
		a=1;
	}
}

我们来看代码的运行结果

由此可见,当参数为基本类型的时候,Java是按值传递的

2、参数为引用类型变量

传代码上殿!!!!

public class Test {
	public static void main(String[] args) {
		String a="abc";
		change(a);
		System.out.println(a);
	}
	public static void change(String a){
		a="1234567";
	}
}

 结果如下:

可见,不论参数为基本类型还是引用类型,Java都是值传递

但是作者曾遇到以下这个问题:

class People{
	int age;
}
public class Test {
	public static void main(String[] args) {
		People p1=new People();
		p1.age=10;
		change(p1);
		System.out.println(p1.age);
	}
	public static void change(People p1){
		p1.age=20;
	}
}

看看结果

为什么这时候,好像发生了引用传递呢?

其实这时候,我们修改的并不是参数指向的存储区域,而是参数指向的存储区域中存储的地址指向的存储区域,换言之,我们修改了对象的属性,而不是对象。因此它并不属于引用传递,它发生的还是值传递,因为对象p1没有变化。

希望对大家有所帮助,如果有错误,欢迎批评指正。

发布了33 篇原创文章 · 获赞 71 · 访问量 4854

猜你喜欢

转载自blog.csdn.net/weixin_44407699/article/details/96299557
今日推荐