0%

Java系统化学习之传递方式

在Java中的方法调用使用的都是值传递,Java 中的所有自变量或参数传递都是通过传递句柄进行的。也就是说,当我们传递“一个对象”时,实际传递的只是指向位于方法外部的那个对象的“一个句柄”。所以一旦要对那个句柄进行任何修改,便相当于修改外部对象。此外:

  1. ■参数传递过程中会自动产生别名问题
  2. ■不存在本地对象,只有本地句柄
  3. ■句柄有自己的作用域,而对象没有
  4. ■对象的“存在时间”在 Java 里不是个问题
  5. ■没有语言上的支持(如常量)可防止对象被修改(以避免别名的副作用)

    形参与实参

形式参数:是在定义函数名和函数体的时候使用的参数,目的是用来接收调用该函数时传入的参数。
实际参数:在调用有参函数时,主调函数和被调函数之间有数据传递关系。在主调函数中调用一个函数时,函数名后面括号中的参数称为“实际参数”。

值传递与引用传递

值传递(pass by value)是指在调用函数时将实际参数复制一份传递到函数中(副本的概念),这样在函数中如果对参数进行修改,将不会影响到实际参数。
引用传递(pass by reference)是指在调用函数时将实际参数的地址直接传递到函数中,那么在函数中对参数所进行的修改,将影响到实际参数。

值传递 引用传递
根本区别 会创建副本,或者是直接句柄处理 不创建副本
结论 方法中无法改变原始对象 方法中可以改变原始对象

代码分析

参考《javap详解

参考

  1. Java 到底是值传递还是引用传递?
  2. Java 函数调用是传值还是传引用?从字节码角度来看看 !