Java的值传递 & 浅聊"引用传递"
写在开始:
关键点: 栈堆内存分析 & 引用传递
1. 示例代码
public class Test{
public static void main(String args[]){
StringBuffer a = new StringBuffer("A");
StringBuffer b = new StringBuffer("B");
method(a,b);
//sout(a); a是 AB
//sout(b); b是 B
}
public static void mehtod(StringBuffer x,StringBuffer y){
x.append(y);
y = x;
//输出x == y 结果true 因为都是指向 A()对象地址
//输出x和y x是AB y也是AB
}
}
2. 栈和堆 内存分析图
3. 结论 Java只有值传递
3.1 基本数据类型 值传递
基本数据类型使用值传递
public static void main(String[] args) {
int A = 2;
int B = 3;
swap(A, B);
System.out.print("swap后A的结果为:"+A); //swap后A的结果为:2
System.out.print("swap后B的结果为:"+B); //swap后B的结果为:3
}
public static void swap(int a, int b){
int temp = a;
a = b;
b = temp;
}
打印结果:
swap后A的结果为:2
swap后B的结果为:3
分析: ①swap方法压栈执行后: ab被初始化一个拷贝(此时a=2;b=3); ②ab的值被交换,但是AB的值没变化 ; ③swap方法结束后,参数变量ab不再使用,被回收。
3.2 Java 没有引用传递
一. Java 没有引用传递
二. Java 传递对象 确实是传递对象的引用。更确切的说是传递的对象引用的副本。
三. Java传递的是引用的副本。而不是引用本身,所以引用没有传递,所以这个不叫引用传递。
3.3 概念(值传递)
值传递(pass by value)是指在调用函数时将实际参数复制一份传递到函数中,这样在函数中如果对参数进行修改,将不会影响到实际参数。
引用传递(pass by reference)是指在调用函数时将实际参数的地址直接传递到函数中,那么在函数中对参数所进行的修改,将影响到实际参数。
值传递 | 引用传递 |
---|---|
建副本 | 无副本 |
不会改变原来对象 | 可以改变对象内容 |
值传递:指的是在方法调用时,传递的参数是按值的拷贝传递,传递的是值的拷贝,也就是说传递后就互不相关了。
引用传递:指的是在方法调用时,传递的参数是按引用进行传递,其实传递的引用的地址,也就是变量所对应的内存空间的地址。传递的是值的引用,也就是说传递前和传递后都指向同一个引用(也就是同一个内存空间)。
3.4 误区
- 错误理解一:通过传递的内容区分,如果是个值,就是值传递。如果是个引用,就是引用传递。
- 错误理解二:Java是引用传递。
- 错误理解三:传递的参数如果是普通类型,那就是值传递,如果是对象,那就是引用传递。
4. 拓展
Java 语言的方法调用只支持参数的值传递。当一个对象实例作为一个参数被传递到方法中时,参数的值就是对该对象的引用。对象的属性可以在被调用过程中被改变,但对对象引用的改变是不会影响到调用者的。
C++和 C#中可以通过传引用或传输出参数来改变传入的参数的值。在 C#中可以编写如下所示的代
码,但是在 Java 中却做不到。
using System;
namespace CS01 {
class Program {
public static void swap(ref int x, ref int y) {
int temp = x;
x = y;
y = temp;
}
public static void Main (string[] args) {
int a = 5, b = 10;
swap (ref a, ref b);
// a = 10, b = 5;
Console.WriteLine ("a = {0}, b = {1}", a, b);
}
}
}
//说明:Java 中没有传引用实在是非常的不方便,这一点在 Java 8 中仍然没有得到改进,正是如此在 Java 编写的代码中才会出现大量的 Wrapper 类(将需要通过方法调用修改的引用置于一个 Wrapper 类中,再将 Wrapper 对象传入方法)
附: 参考资料 Java只有值传递 引用地址: https://www.jianshu.com/p/2fe41262e498
写在最后:
上面内容是简单笔记,仍需完善
如有问题,欢迎大家指正,本人及时修改,灰常感谢!