public class String_test {
public static void fun(String str){
str="b";
}
public static void main(String[] args) {
String str1="a";
System.out.println(str1);
fun(str1);
System.out.println(str1);
}
}
为什么会输出 :
a
a
这个问题要涉及到值传递跟引用传递了。
那么问题来了,到底什么是值传递,什么是引用传递呢?
要想知道什么是值传递跟引用传递,需要先知道什么是基本数据类型跟引用数据类型。
基本数据类类型存的是数值本身。而引用类型变量在内存放的是数据的引用,并不是数据的本身,引用类型变量是以间接方式去获取数据。
引用类型变量都属于对象类型,如:数组、类、字符串等都属于引用类型变量。所以,引用类型变量里面存放的是数据的地址。
说白了基本数据类型变量就像是直接放在柜子里的东西,而引用数据类型变量就是这个柜子对应编码的钥匙。钥匙号和柜子对应。
了解了基本数据类型和引用数据类型之后,再来了解值传递跟引用传递。
值传递:方法调用时,实际参数把它的值传递给对应的形式参数,方法执行中形式参数值的改变不影响实际参数的值。
引用传递:也称为传地址。方法调用时,实际参数的引用(地址,而不是参数的值)被传递给方法中相对应的形式参数,在方法执行中,对形式参数的操作实际上就是对实际参数的操作,方法执行中形式参数值的改变将会影响实际参数的值。
值传递时,等于传递了一个副本,传过去之后就跟原变量无关了,在副本上做的任何操作都不会对原变量造成任何影响,所以原变量的值不会变。
引用传递时,传过去的是一个地址,指向存放变量值的地址,等于说是原变量拷贝了一个地址传过去,拷贝的地址跟原变量的地址都是指向的同一个地址,这个地址内存放的是变量的值,如果改了这个值,那么原变量的值就会改变。
我举两个例子:
例子1:String s="a";
Srting s=new String ("a")
哪个是基本数据,哪个是对象类型?
String s="a";
Srting s=new String ("a")
哪个是基本数据,哪个是对象类型?
String是引用数据类型,是final类型的,你在问题中的是值传递,不会改变原变量的值,因为传过去的是原变量的一个副本。
追问"a"="b"?
传进去的参数的值 不就是"a"吗??