【Java的值传递 & 浅聊“引用传递“ & 栈堆内存分析】

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. 栈和堆 内存分析图

示例1内存分析图

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

写在最后:
上面内容是简单笔记,仍需完善
如有问题,欢迎大家指正,本人及时修改,灰常感谢!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值