Java 參數傳遞問題

Java參數傳遞

  • 給出了基本類型和引用類型參數傳遞時行為的示例,并給出了String類型作為參數傳遞時表現出的和一般引用類型傳遞行為不同的原因
  • 使用基本類型進行參數傳遞時的代碼示例
public class Test1 {

        public static void main(String[] args) {

        int n = 3;

        System.out.println("Before change, n = " + n);

        changeData(n);

        System.out.println("After changeData(n), n = " + n);

    }
    public static void changeData(int nn) {
        n = 10;
    }
}
  • **基本類型作為參數傳遞時,是傳遞值的拷貝,無論你怎么改變這個拷貝,原值是不會改變的
    **,輸出的結果證明了這一點:
    Before change, n = 3
    After changeData(n), n = 3

  • 使用引用類型進行參數傳遞的代碼示例

public class Test2 {

       public static void main(String[] args) {

        StringBuffer sb = new StringBuffer("Hello ");

        System.out.println("Before change, sb = " + sb);

        changeData(sb);

        System.out.println("After changeData(n), sb = " + sb);

    }

    public static void changeData(StringBuffer strBuf) {

        strBuf.append("World!");
    }
}
  • 在Java中對象作為參數傳遞時,是把對象在內存中的地址拷貝了一份傳給了參數
    Test2輸出結果
    Before change, sb = Hello
    After changeData(n), sb = Hello World!
  • 傳遞引用型參數,并在子方法中對參數進行變更的一種情況
public class Test3 {

       public static void main(String[] args) {

        StringBuffer sb = new StringBuffer("Hello ");

        System.out.println("Before change, sb = " + sb);

        changeData(sb);

        System.out.println("After changeData(n), sb = " + sb);

    }

    public static void changeData(StringBuffer strBuf) {

           strBuf = new StringBuffer("Hi ");
           strBuf.append("World!");
    }
}

運行一下這個程序,結果是這樣的:
Before change, sb = Hello
After changeData(n), sb = Hello

Java中的參數傳遞方式

  • 通過分析Java參數傳遞時的內存模型,給出了Java參數傳遞時內存中實際發生的行為
  • 基本類型代碼示例和內存模型示意圖
public class ParameterTransfer {
    public static void main(String[] args) {
        int num = 30;
        System.out.println("調用add方法前num=" + num);
        add(num);
        System.out.println("調用add方法后num=" + num);
    }
 
    public static void add(int param) {
        param = 100;
    }
}
調用前num變量內存狀態

方法調用發生時全局變量num和add方法參數num的內存狀態
  • 兩個變量的內存都被分配在棧中,從內存地址的角度來看,對8600地址的修改,不會反映到8500地址上面
  • 使用引用類型時的代碼示例和內存模型示例
public class ParameterTransfer {
    public static void main(String[] args) {
        String[] array = new String[] {"huixin"};
        System.out.println("調用reset方法前array中的第0個元素的值是:" + array[0]);
        reset(array);
        System.out.println("調用reset方法后array中的第0個元素的值是:" + array[0]);
    }
 
    public static void reset(String[] param) {
       param[0] = "hello, world!";
    }
}

調用前全局array變量的內存狀態

調用時全局array變量和方法參數array的內存狀態

在reset方法中進行修改后,兩個array變量的內存狀態

在Java語言中,以String作為類型的變量在作為方法參數時所表現出的“非對象”的特性

基本結論

基本類型作為參數傳遞時,是傳遞值的拷貝,無論你怎么改變這個拷貝,原值是不會改變的
****在****Java****中對象作為參數傳遞時,是把對象在內存中的地址拷貝了一份傳給了參數****
****在參數列表中的變量,和傳遞進方法的參數,不在同一個地址上面****

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 1. Java基礎部分 基礎部分的順序:基本語法,類相關的語法,內部類的語法,繼承相關的語法,異常的語法,線程的語...
    子非魚_t_閱讀 31,769評論 18 399
  • 一、 1、請用Java寫一個冒泡排序方法 【參考答案】 public static void Bubble(int...
    獨云閱讀 1,421評論 0 6
  • 小編費力收集:給你想要的面試集合 1.C++或Java中的異常處理機制的簡單原理和應用。 當JAVA程序違反了JA...
    八爺君閱讀 4,673評論 1 114
  • [TOC] StringBuffer類 StringBuffer類概述及其構造方法 StringBuffer類概述...
    lutianfei閱讀 491評論 0 1
  • 今天是周五,作業很多,傅楊琳和牛牧童最難完成的一項作業是試卷,因為她倆幾乎認識不了卷面上的幾個字。我只好先讓她倆認...
    甜甜書屋閱讀 332評論 0 1