今天早上我了一道有關java的題。主要考點是考java中值得傳遞方式。
之前我在javaoo里總結的是:基本數據類型中保存的是實際的值,引用數據類型保存的是被引用的內存地址,那么基本數據類型就是按值傳遞,引用數據類型就是按地址來傳遞的。(難道我一開始就錯了)
題是真樣的:
1 public class SendValue{ 2 public String str="6"; 3 public static void main(String[] args) { 4 SendValue sv=new SendValue(); 5 sv.change(sv.str); 6 System.out.println(sv.str); 7 } 8 public void change(String str) { 9 str="10"; 10 } 11 }
輸出的結果是:?6
有解釋說:change方法里面是將傳入的參數修改成10,但是並沒有對SendValue的屬性str就行修改,要修改必須指明this.str="10",所有答案還是6。
還有一題是這樣的:
1 public class Example{ 2 String str=new String("hello"); 3 char[]ch={'a','b'}; 4 public static void main(String args[]){ 5 Example ex=new Example(); 6 ex.change(ex.str,ex.ch); 7 System.out.print(ex.str+" and "); 8 System.out.print(ex.ch); 9 } 10 public void change(String str,char ch[]){ 11 str="test ok"; 12 ch[0]='c'; 13 } 14 }
輸出的答案是 : ? hello and cb;
有的解釋說:String類是final類型的,不能繼承和修改這個類。str=“tesk ok”,其實是隱含的讓Java生成一個新的String對象,那么就與原來的“Hello”沒有任何關系,當函數結束,str作用結束,所以輸出的還是“Hello”。 char ch[] 是傳遞引用,修改了原內容。
然后我上網查,java是按值傳遞還是引用傳遞,有的說:
按值傳遞:指的是在方法調用時,傳遞的參數是按值的拷貝傳遞。就是說傳遞的是拷貝后的值,與前面那個值無關了。
引用傳遞:指的是在方法調用時,傳遞的參數是按引用進行傳遞,其實傳遞的引用的地址,也就是變量所對應的內存空間的地址。傳遞前后都是同一個引用。
但是又有人說這是不對的,他說Java中只有按值傳遞,沒有按引用傳遞!
各位大神們,給我解釋解釋嘛!