java只存在值传递

2019-02-28  本文已影响0人  朱朱今天撸代码了吗

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

执行过程:

  1. x被初始化为price值的一个拷贝,即5

  2. x乘以2后等于10。但是price没有变化,依然是5

  3. doubleValue执行完后,参数变量不再使用,形参被回收

java值传递基本数据类型作为参数.jpg

对象引用作为参数

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

运行过程:

  1. 将对象a,b的拷贝分别赋值给x,y,此时a和x指向同一对象,b和y指向同一对象

  2. swap方法体完成x,y的的交换,此时a,b并没有变化

  3. 方法执行完成,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

参考博客:https://www.cnblogs.com/xiaoxiaoyihan/p/4883770.html

上一篇下一篇

猜你喜欢

热点阅读