Java入门-方法传参


无论是基本类型的值传递,还是引用类型的参数传递,在 Java 中方法总是采用按值调用。对于引用类型,传递的是其对应的内存空间地址。

基本类型的值传递

public class PrimitiveTransferTest {
    public static void swap(int a, int b) {
        int tmp = a;
        a = b;
        b = tmp;
        System.out.println("swap 方法里 a 的值为: " + a + " b的值为: " + b);
    }

    public static void main(String[] args) {
        int a = 6;
        int b = 9;
        swap(a, b);
        System.out.println("交换结束后 a 的值为 " + a + " b的值为 " + b);
    }
}

/**
运行结果:
swap 方法里 a 的值为: 9 b的值为: 6
交换结束后 a 的值为 6 b的值为 9
*/

分析图:

main 方法中定义了a、b 变量存储示意图,如下:

main 方法中的变量作为参数值传入 swap() 方法存储示意图,如下:

swap 方法中 a、b 交换后的存储示意图,如下:

java 程序总是从 main() 方法开始执行,main() 方法定义了 a、b 两个局部变量,两个变量在 main 栈区中。在 main() 方法中调用 swap() 方法时,main() 方法此时还未结束,因此系统为 main 方法和 swap 方法分配了两块栈区,用于保存 main 方法和 swap 方法的局部变量。main 方法中的 a、b 变量作为参数传入 swap 方法,实际上是在 swap 方法栈区中重新产生了两个变量 a、b,并将 main 方法栈区中 a、b 变量的值分别赋给 swap 方法栈区中的 a、b 参数(这就是初始化)。此时系统内存中有两个 a 变量、两个 b 变量,只是存在于不同的方法栈区中而已。

引用类型的参数传递

public class ReferenceTransferTest {
    public static void swap(DataWrap dw) {
        int tmp = dw.a;
        dw.a = dw.b;
        dw.b = tmp;
        System.out.println("swap 方法里, a 成员变量的的值为: " + dw.a + " b 成员变量的值为: " + dw.b);
    }

    public static void main(String[] args) {
        DataWrap dw = new DataWrap();
        dw.a = 6;
        dw.b = 9;
        swap(dw);
        System.out.println("交换结束后, a 成员变量的的值为: " + dw.a + " b 成员变量的值为: " + dw.b);
    }
}

/**
swap 方法里, a 成员变量的的值为: 9 b 成员变量的值为: 6
交换结束后, a 成员变量的的值为: 9 b 成员变量的值为: 6
*/

你可能会疑问,dw 对象的成员变量 a、b的值也被替换了,这跟前面基本类型的传递完全不一样。这非常容易让人觉得,调用传入 swap 方法的就是 dw 对象本身,而不是它的复制品。其实传递的依然是 dw 的值。

分析图:

main 方法中创建 DataWrap 对象后的存储示意图,如下:

main 方法中 dw 传入 swap() 方法后的存储示意图,如下:

系统一样赋值了 dw 的副本,只是关键在于 dw 只是一个引用变量,它存储的值只是一段内存地址,将该内存地址传递给 swap 栈区,此时 swap 栈区的 dw 和 main 栈区的 dw 的值也就是内存地址相同,该段内存地址指向堆内存中的 DataWrap 对象。对 swap 栈区的 dw 操作,也就是对 DataWrap 对象操作。


文章作者: Tianny
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Tianny !
评论
 上一篇
Java入门-多态 Java入门-多态
Java 引用变量有两个类型。如果编译时类型和运行时类型不一致,就可能出现多态。 编译时类型:由声明该变量时使用的类型决定 运行时类型:由实际运行时赋给该变量的对象决定 向上类型转换示例代码: public class BaseCl
2020-03-17
下一篇 
Java入门-数组 Java入门-数组
数组是用来存储固定大小的同类型元素。一旦数组初始化完成,数组在内存中所占的空间将被固定下来,因此数组的长度不可以改变。即使某个数组的元素被清空,但是它所占的空间依然保留。 数组本身也是一种引用类型,既可以存储基本数据类型,也可以存储引用类型
2020-03-15
  目录