java String 参数传递问题 如下程序

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:
//在函数中传递基本数据类型,   
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")
哪个是基本数据,哪个是对象类型?

追答

String是引用数据类型,是final类型的,你在问题中的是值传递,不会改变原变量的值,因为传过去的是原变量的一个副本。

追问

"a"="b"?

温馨提示:内容为网友见解,仅供参考
第1个回答  2014-11-28
刚写了个例子,你一看就懂.
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的值.
第2个回答  2014-11-28
fun(str1);这一句话的意思是把str1的值(其实也就是“a”的地址)赋给fun方法里面的str
,然后方法里面又把"B"的地址赋给str。调用结束后str1里面存放的地址并没有改变。
第3个回答  2014-11-28
fun 没有返回值,而且fun里面仅局部变量str1 修改。
所以主方法的变量 str1 没有任何影响。
第4个回答  2014-11-28
只是改变了传进去的参数的值,实际的值并没有改变追问

传进去的参数的值 不就是"a"吗??

相似回答