Java之中的值传递问题
其他的程序语言里面都存在值传递和引用传递两种传递方式 值传递就是把值拷贝一次传递到调用的函数之中 而引用传递则是
但是java中只存在值传递,只存在值传递!!!
然而我们经常看到对于对象(数组,类,接口)的传递似乎有点像引用传递,可以改变对象中某个属性的值。但是不要被这个假象所蒙蔽,实际上这个传入函数的值是对象引用的拷贝,即传递的是引用的地址值,所以还是按值传递。
Java总是采用按值调用。方法得到的是所有参数值的一个拷贝,特别的,方法不能修改传递给它的任何参数变量的内容。
方法参数共有两种类型:
-
基本数据类型
-
对象引用
基本数据类型作为参数
public class ParamTest {
public static void main(String[] args) {
int price = 5; doubleValue(price);
System.out.print(price);
}
public static void doubleValue(int x) { x = 2 * x; }
}
output:5
执行过程:
-
x被初始化为price值的一个拷贝,即5
-
x乘以2后等于10。但是price没有变化,依然是5
-
doubleValue执行完后,参数变量不再使用,形参被回收
对象引用作为参数
class Student {
private float score;
public Student(float score) { this.score = score; }
public void setScore(float score) { this.score = score; }
public float getScore() { return score; }
}
public class ParamTest {
public static void main(String[] args) {
Student stu = new Student(80);
raiseScore(stu);
System.out.print(stu.getScore());
}
public static void raiseScore(Student s) { s.setScore(s.getScore() + 10); }
}
output:
90.0
运行过程:
1.s拷贝了stu的值,他们两个指向内存之中的同一个对象
2.在raiseScore函数之中,改变了s指向的Student对象的score 但是因为s和stu指向的是内存中的同一个地址(也就是同一个对象) 所以这样实际上就是改变了stu的score
3.函数调用结束之后,释放形参s。stu依旧指向原来的那个对象,但是score已经在函数中被改变了
java值传递对象引用作为参数.jpg证明对对象是值传递的例子
首先编写一个交换两个学生的方法:
public static void swap(Student x, Student y) { Student temp = x; x = y; y = temp; }
如果java对对象是采用的是引用传递,那个这个方法是可以的。那么x,y对象的分数是交换的。看下面的例子:
class Student {
private float score;
public Student(float score) { this.score = score; }
public void setScore(float score) { this.score = score; }
public float getScore() { return score; }
}
public class ParamTest {
public static void main(String[] args) {
Student a = new Student(0);
Student b = new Student(100);
System.out.println("交换前:");
System.out.println("a的分数:" + a.getScore() + "--- b的分数:" + b.getScore());
swap(a, b);
System.out.println("交换后:");
System.out.println("a的分数:" + a.getScore() + "--- b的分数:" + b.getScore());
}
public static void swap(Student x, Student y) {
Student temp = x;
x = y;
y = temp; }
}
output:
交换前: a的分数:0.0--- b的分数:100.0 交换后: a的分数:0.0--- b的分数:100.0
运行过程:
-
将对象a,b的拷贝分别赋值给x,y,此时a和x指向同一对象,b和y指向同一对象
-
swap方法体完成x,y的的交换,此时a,b并没有变化
-
方法执行完成,x和y不再使用,a依旧指向new Student(0),b指向new Student(100)
创建两个对象
![证明值传递3.jpg](https://img.haomeiwen.com/i8415275/d7a16b85d48bd488.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)进入方法体,将对象a,b的拷贝分别赋值给x,y
证明值传递2.jpg
交换x,y的值 函数调用完成之后,x,y被回收 a 、b依旧指向原对象。
证明值传递3.jpg
网友评论