Day30--值传递和引用传递
Day30--值传递和引用传递
在 Java 中,参数传递采用的只有值传递,没有引用传递
值传递
示例:
创建一个叫change的方法,a=10;
package com.liu.oop.demo01;
//值传递
public class Demo04 {
public static void main(String[] args) {
}
//返回值为空
public static void change(int a){
a=10;
}
}
当不调用change方法的时候,定义a=1,输出a的结果为1
package com.liu.oop.demo01;
//值传递
public class Demo04 {
public static void main(String[] args) {
int a=1;
System.out.println(a);//1
}
//返回值为空
public static void change(int a){
a=10;
}
}
当调用a的结果的时候,a的值还是1
package com.liu.oop.demo01;
//值传递
public class Demo04 {
public static void main(String[] args) {
int a=1;
System.out.println(a);//1
//调用change方法:
change(a);
System.out.println(a);//1
}
//返回值为空
public static void change(int a){
a=10;
}
}
为什么呢?
是因为返回值为void空吗?
那就修改一下返回值
package com.liu.oop.demo01;
//值传递
public class Demo04 {
public static void main(String[] args) {
int a=1;
change(a);
System.out.println(a);//1
}
//返回值为空
public static int change(int a){
a=10;
return 10;
}
}
结果仍然为1
可见,并不是简单的“返回值的问题”
事实上,在 Java 中,参数传递是值传递机制起主要作用,这与方法的返回值类型无关。
当把main
方法中的变量a
传递给change
方法时,传递的是a
的值(这里是1
)的副本,此时change
方法内部的a
就相当于一个新的局部变量,它初始值是接收到的1
。
即使change
方法有返回值(比如改成返回int
类型并返回修改后的a
的值),在没有通过合适的方式在main
方法中接收并处理这个返回值的情况下,change
方法内部对其局部变量a
的操作依然不会影响到main
方法中的原始变量a
。
在进一步理解:
- 值传递的基本概念(结合示例)
- 在 Java 中,参数传递是值传递。对于基本数据类型,比如
int
,当你在main
方法中定义int a = 1
,此时a
在内存中有一个存储位置,存储的值是1
。 - 当调用
change(a)
时,会把a
的值(也就是1
)复制一份传递给change
方法中的参数a
。这就好像是做了一个克隆操作,现在change
方法中的a
和main
方法中的a
是两个独立的个体,只是初始值相同。如果不想办法,把change
方法中的a
赋值给main
方法中的a
,则change
方法中的a
与main
方法中的a
无关 - 就好比你有一张写着数字
1
的纸条(代表main
方法中的a
),当你把这个数字抄在另一张纸条上(代表传递给change
方法的a
),然后你在第二张纸条上修改数字为10
,第一张纸条上的数字依然是1
。
- 在 Java 中,参数传递是值传递。对于基本数据类型,比如
- 内存中的体现(简单理解)
- 在内存中,
main
方法中的变量a
存储在栈内存的一个位置。当调用change
方法时,会在栈内存为change
方法的参数a
开辟一个新的空间,并且把main
方法中a
的值复制到这个新空间中。 - 所以当
change
方法内部修改它自己的a
变量时,是在修改这个新空间中的值,而不是修改main
方法中a
变量所在的空间的值。
- 在内存中,
准确的代码:
package com.liu.oop.demo01;
//值传递
public class Demo04 {
public static void main(String[] args) {
int a = 1;
// 调用修改后的change方法并接收返回值
a = change(a); //把**`change`方法中的`a`赋值给`main`方法中的`a`**
System.out.println(a);
}
// 修改为有返回值的方法
public static int change(int a) {
a = 10;
return a;
}
}
引用传递:
package com.liu.oop.demo01;
//引用传递 :对象 本质上还是值传递
//对象:内存
public class Demo05 {
public static void main(String[] args) {
Person person = new Person();
System.out.println(person.name);//null
Demo05.change(person);
System.out.println(person.name);//爱锟
}
public static void change(Person person){
//“perosn是一个对象:指向的--->Perosn perosn=new Perosn();这是一个具体的人,可以改变属性!”
person.name="爱锟";
}
}
//定义了一个person类,有一个属性 :name
class Person{
//String的默认值为null
String name;
}