java String 参数传递问题 如下程序
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:
//在函数中传递基本数据类型,
public class Test {
public static void change( int i, int j) {
int temp = i;
i = j;
j = temp;
}
public static void main(String[] args) {
int a = 3 ;
int b = 4 ;
change(a, b);
System.out.println( "a=" + a);
System.out.println( "b=" + b);
}
}
结果为:
a= 3
b= 4
原因就是 参数中传递的是 基本类型 a 和 b 的拷贝,在函数中交换的也是那份拷贝的值 而不是数据本身;
例子2:
//传的是引用数据类型
public class Test {
public static void change( int [] counts) {
counts[ 0 ] = 6 ;
System.out.println(counts[ 0 ]);
}
public static void main(String[] args) {
int [] count = { 1 , 2 , 3 , 4 , 5 };
change(count);
}
}
在方法中 传递引用数据类型 int 数组,实际上传递的是其引用count的拷贝,他们都指向数组对象,在方法中可以改变数组对象的内容。即:对复制的引用所调用的方法更改的是同一个对象。
String s="a";
Srting s=new String ("a")
哪个是基本数据,哪个是对象类型?
String s="a";
Srting s=new String ("a")
哪个是基本数据,哪个是对象类型?
package com.test1;
import java.util.HashMap;
import java.util.Map;
public class Test {
public static void main(String[] args) {
Map<String, String> map=new HashMap<String, String>();
map.put("a", "c");
map.put("b", "d");
System.out.println(map.get("a"));
System.out.println(map.get("b"));
fun(map);
System.out.println(map.get("a"));
System.out.println(map.get("b"));
}
public static void fun(Map<String, String> map) {
map.put("a", "a");
map.put("b", "b");
}
}
传递参数分为值传递和引用传递,值传递是不会改变原本的值的,引用传递指向的是对象的地址,会改变对象里面的值. 除了String对象是值传递之外,其他的对象都是引用传递.你这里刚好传的参数是String ,所以是值传递,也就是说不会改变这个String的值.
,然后方法里面又把"B"的地址赋给str。调用结束后str1里面存放的地址并没有改变。
所以主方法的变量 str1 没有任何影响。
传进去的参数的值 不就是"a"吗??