JAVA函數的參數傳遞

JAVA開發過程當中寫函數都是不可避免的因而乎參數傳遞常常會困擾咱們,特別是有C/C++功底的童鞋總會糾結於「java究竟是值傳遞仍是引用傳遞?java

先來一段代碼(和程序員交流最好的果真仍是代碼)程序員

public class TestMain {
        public static void main(String[] args) {
                List<Integer> list = new ArrayList<Integer>();
                for (int i = 0; i < 10; i++) {
                        list.add(i);
                }
                add(list);
                for (Integer j : list) {
                        System.err.print(j+",");;
                }
                System.err.println("");
                System.err.println("*********************");
                String a="A";
                append(a);
                System.err.println(a);
                int num = 5;
                addNum(num);
                System.err.println(num);
        }
       
        static void add(List<Integer> list){
                list.add(100);
        }
       
        static void append(String str){
                str+="is a";
        }
        static void addNum(int a){
                a=a+10;
        }
}
打印出來的結果是:
0,1,2,3,4,5,6,7,8,9,100,
*********************
A
5
因而就有人說,list是引用傳遞因此能夠改變本身的值,String ,int是值傳遞因此不能改變本身的值,這的是這樣麼?
int還能說因爲不是對象,可是list和String你們都是對象憑什麼一個就是引用傳遞一個就是值傳遞了,看臉麼?
其實你們多是被C/C++中指針的概念混淆了,因爲java中沒有指針因此:

根據Horstmann的《java核心技術》(中文第8版P115-P117)的描述,java中是沒有引用傳遞的,原文摘錄以下:app

「java程序設計語言老是採用值調用。也就是說,方法獲得的是全部參數值的一個拷貝,特別是,方法不能修改傳遞給它的任何參數變量的內容。」函數

「有些程序員(甚至是本書的做者),認爲java程序設計語言對對象採用的是引用調用,實際上這種理解是不對的。」spa

其實JAVA函數傳遞的都是值,若是我把上面的代碼變造成下面的代碼估計全部人都不會再有困惑了吧(^ ^)
public class TestMain {
        public static void main(String[] args) {
                List<Integer> list = new ArrayList<Integer>();
                for (int i = 0; i < 10; i++) {
                        list.add(i);
                }
                { List<Integer> list1 = lsit;
                    list1.add(100);  
                }
                for (Integer j : list) {
                        System.err.print(j+",");;
                }
                System.err.println("");
                System.err.println("*********************");
                String a="A";
                { String a1 = a;
                    a1 += "is a"; }
                System.err.println(a);
                int num = 5;
                 { int a1 = num;
                  a1 = a1 + 10; }
                System.err.println(num);
        }
}
                                                

紅色部分就是被展開的函數,參數中的變量的值是外部傳入的值,函數內修改的都只是函數內部變量的值,這樣能理解函數的參數到底傳遞的是什麼了麼?設計

在有人和你說值傳遞和引用傳遞,直接糊他一臉吧~~~指針

相關文章
相關標籤/搜索