值传递和引用传递
程序员文章站
2024-02-11 13:32:40
...
1、值传递
值传递的参数都是基本数据类型(如int、long和char等),在值传递里,所以的参数传递都采用值传递的方式,就是传递参数到方法时,方法获得的只是一个副本,所以方法不会改变参数变量的值,只是使用该参数变量的值
2、引用传递
引用传递指参数传递的是引用数据类型,则方法获得的是这个对象的内存地址,所以方法可以改变对象的属性,但不能改变对象本身
/**
* 值传递
*/
public static void main(String[] args) {
int x = 10;
int y = 20;
System.out.println("传递前的值:x="+x+",y="+y);
add(x,y);
System.out.println("传递后的值:x="+x+",y="+y);
}
/**
* @param x
* @param y
*/
private static void add(int x, int y) {
int k = x+y;
y = x;
x = k;
System.out.println("add方法中的值:x="+x+",y="+y);
}
}
运行结果:
传递前的值:x=10,y=20
add方法中的值:x=30,y=10
传递后的值:x=10,y=20
/**
* 引用传递
*/
class Student {
int number;
public Student(int number) {
this.number = number;
}
}
public class TestDemo5 {
public static void change(Student s) {
s.number = 2000;
}
public static void main(String[] args) {
Student stu = new Student(10);
System.out.println("引用传递前:"+stu.number);
change(stu);
System.out.println("引用传递后:"+stu.number);
}
}
运行结果:
引用传递前:10
引用传递后:2000
引用传递过程解析:
在程序执行到Student stu = new Student(10)时,分别在栈内存(储存对象的引用)和堆内存(储存对象)开辟空间供对象stu使用,程序执行到change()方法时,将对象stu的副本作为参数传递到change()方法,形参与实参指向同一地址,即同一对象,change()方法通过形参堆stu对象的属性number进行操作并改变了number的值,这一改变结果保留在对象中,但change()方法执行结束后,形参的引用被断开,但stu还是指向已经被改变的对象,所以最好stu.number=2000;
但是注意:
String用于引用传递,传形参后,执行完方法,变量的值并不会改变,这是因为String不可变的特性;
public class TestDemo5 {
public static void change(String s) {
s = "司马懿";
}
public static void main(String[] args) {
String s = "诸葛亮";
System.out.println("引用传递前:"+s);
change(s);
System.out.println("引用传递后:"+s);
}
}
运行结果:
引用传递前:诸葛亮
引用传递后:诸葛亮
上一篇: dowhy学习1