Java方法传参:值传递还是引用传递?

在Java方法传参中有一个让疑惑又很经典的问题:在方法传递时,到底传递的是值,还是引用?
其实Java只有值传递这一种。不过是传数据值还是地址值的问题。
首先我们要知道两个Java存储区:栈(虚拟机栈)和堆。

我们说的“栈”就是虚拟机栈,虚拟机栈描述的是Java方法执行的内存模型:每个方法在执行的同时会创建一个栈帧用于存储局部变量表、操作数栈、动态链接、方法出口等信息。
局部变量表存放了编译期可知的各种基本数据类型(boolean、byte、char、short、int、float、long、double)、对象引用(reference类型,它不等同于对象本身,可能是一个指向对象起始地址的引用指针,也可能是指向一个代表对象的句柄或者其他与此对象相关的位置)和returnAddress类型(指向一条字节码指令的地址) ——《深入理解Java虚拟机》

大白话:就是每个方法在执行的时候建了一个叫栈帧东西,它存储了局部变量表,这个表里面又存储了基本类型,还有对象的引用。
对于堆:就是存放对象的地方。

此内存的唯一目的就是就是存放对象的实例,几乎所有的对象实例都在这里分配内存 ——《深入理解Java虚拟机》

基本类型的变量存储的是数据值,那么对象的引用存储的是什么呢?
我们来看一个简单的demo:
在这里插入图片描述
它存放的是在指向堆里对象的地址值。
我们再看一个简单demo:

package com.String;

import java.util.Arrays;

public class Test {

	public static void main(String[] args) {
		int a=1;
		int b=2;
		change(a,b);
		System.out.println("a:"+a+" b:"+b);
	
		int []arr= {5};
		change(arr);
		System.out.println("arr[0]:"+Arrays.toString(arr));
		

	}
	//传递的是数据值的副本
public static void change(int a,int b)
{
	a=b;
	b=a+b;
}
	//传递的是地址值的副本,依旧指向堆里的对象
public  static void change(int []arr)
{
	arr[0]=1;
}
	
}

结果:
a:1 b:2
arr[0]:[1]

解释:方法传参传递的是什么:本质都是传值,但是基本类型传递的是值的副本,和原本的变量没有关系,但是引用类型的值,就是地址,传递的地址,对地址的操作就会指向堆里对象的操作。所以会改变对象本身。而基本类型则不会,一个副本改变对我没有丝毫的影响。
内存图解:
在这里插入图片描述

参考:https://blog.csdn.net/jiangnan2014/article/details/22944075

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值