值传递是在调用方法的时候出现的概念,如果在调用方法的时候传递的参数是原变量的一个副本(拷贝原来的变量而得到),那么这个种参数的传递方式叫做值传递,与值传递对应的引用传。当传递的参数是一个引用类型数据(非基本数据类型的时候,此时如果传递的是原变量(此时的元变量是一个对象的地址)的副本(地址的副本)那么依然属于值传递,如果传递的是原变量的真正引用(不需要副本就是同一个)那么这种传递方式就是引用传递。
基本数据类型的参数
package com.bai.demo;
public class Hello {
public static void main(String[] args) {
//声明了变量
int num=10;
change(num);
System.out.println(num);
}
//改变变量的值,该方法改变了你传递的实际参数
public static void change(int temp) {
temp*=10;
}
}
结果为10;发现num没有被改变。如果方法的参数类型是基本的数据类型则在传递实际参数的时候本质将原来的num赋值一个副本传递给方法,那么在方法中修改的值就是一个副本,对原来的值没有影响。
引用数据类型的参数
package com.bai.demo;
public class Hello {
public static void main(String[] args) {
//声明了变量
Person per=new Person();
per.name="范建";
//调用方法
change(per);
System.out.println(per.name);
}
//改变变量的值,该方法改变了你传递的实际参数
public static void change(Person temp) {
temp.name="范统";
}
}
结果为范统。
当执行chang(per)【chang(per);per=temp】的时候会将per的值赋值给temp,此时temp和per的值是一样指向同一块堆内存空间,那么在change方法中修改对象之后对per也有影响。
这种方式是值传递还是引用传递?
其实上还是值传递,因为调用change的时候相当于把per的值复制一份给temp,只不过这个值还是一个引用,就是基于传递的是一个引用所以很多人就将其定义为引用传递。
String
package com.bai.demo;
public class Hello {
public static void main(String[] args) {
//声明了变量
String str ="Hello";
change(str);
System.out.println(str);
}
//改变变量的值,该方法改变了你传递的实际参数
public static void change(String temp) {
temp="World";
}
}
发现了此时输出的是Hello,String是引用数据类型,引用数据类型在座位实参传递之后再方法中进行修改不都是影响到原来的对象吗?
String类型的特殊性
总结
1.值传递的概念
2.我们认为Java是不存在引用传递
3.字符串的特殊性