作者依旧尽量用白话和简洁的代码,希望帮到更多人
首先,我们来了解一下什么是按址传递与按址(引用)传递
按值传递:
将方法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没有变化。
希望对大家有所帮助,如果有错误,欢迎批评指正。