java形参方法内重新赋值原理_Java方法参数传递机制原理解析

这篇文章主要介绍了Java方法参数传递机制原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

Java方法中如果声明了形参,在调用方法时就必须给这些形参指定参数值,实际传进去的这个值就叫做实参。

这就涉及到Java中的参数传递机制,值传递。

基本数据类型

基本数据类型,值传递的体现是数值的传递。

public class TransferTempTest {

public static void main(String[] args) {

//基本数据类型参数传递

TransferTempTest test = new TransferTempTest();

int num1 = 10;

int num2 = 20;

System.out.println("进行交换前:");

System.out.println("num1 = " + num1 + ",num2 = " + num2);

test.swap(num1, num2);

System.out.println("交换之后:");

System.out.println("num1 = " + num1 + ",num2 = " + num2);

}

public void swap(int a, int b) {

int temp = a;

a = b;

b = temp;

System.out.println("交换过程中:");

System.out.println("num1 = " + a + ",num2 = " + b);

}

}

//运行结果

进行交换前:

num1 = 10,num2 = 20

交换过程中:

num1 = 20,num2 = 10

交换之后:

num1 = 10,num2 = 20

整个过程的内存图演示:

ddedba04c6d2b00e499343daa5833e10.png

如图所示:

在堆内存中创建 TransferTempTest类型的对象,假设此时地址值时0x1177(只是假设),并让栈内存中的引用变量test存储0x1177,指向该对象。

在栈内存中声明两个变量num1和num2,并为他们赋值10和20。这时可以看到打印的结果为:num1 = 10,num2 = 20

程序继续向下,进入swap方法,首先在栈区声明两个变量a和b,他们都是形参,这时将num1和num2的值分别传入,此时如蓝色字体所显示,a=10,b=20。

接着还是在栈区声明一个名为temp的变量,这时执行的交换过程是在swap方法中,交换的变量其实是num1和num2的拷贝值,所以方法内打印:num1 = 20,num2 = 10

最后,退出这个方法,局部变量销毁,发现其实一顿操作,原先的值根本就没有改变,打印结果和原先一样:num1 = 10,num2 = 20

引用数据类型

基本数据类型,值传递的体现是地址值的传递。

public class TransferTempTest {

public static void main(String[] args) {

//引用类型参数传递

DataTemp data = new DataTemp();

data.a = 2;

data.b = 4;

System.out.println("进行交换前:");

System.out.println("data.a = " + data.a + ",data.b = " + data.b);

data.swapClass(data);

System.out.println("进行交换后:");

System.out.println("data.a = " + data.a + ",data.b = " + data.b);

}

}

class DataTemp {

int a;

int b;

public void swapClass(DataTemp data) {

int temp = data.a;

data.a = data.b;

data.b = temp;

System.out.println("交换过程中:");

System.out.println("data.a = " + data.a + ",data.b = " + data.b);

}

}

//运行结果

进行交换前:

data.a = 2,data.b = 4

交换过程中:

data.a = 4,data.b = 2

进行交换后:

data.a = 4,data.b = 2

整个过程的内存图显示:

704b80af7307adb1b89f234c99ee5178.png

如图所示:

在堆内存中创建DataTemp类型的对象,并让栈内存中的引用变量data存储0x7788(假设地址值),指向该对象,实例变量a和b的初始值都是0。

让data.a=2,data.b=4,如蓝色字体显示,这时打印:data.a = 2,data.b = 4

进入swapClass方法,首先在栈区声明形参变量data,将原来的data的地址值传入,红黑两个data不是同一个!!,红色data只是黑色data的拷贝值,且拷贝的是地址值。这时两个data指向同一片堆区内存,如红色箭头显示。

接着还是在栈区声明一个名为temp的变量,参与交换操作,这时操作的是堆区的数据,所以方法里显然打印:data.a = 4,data.b = 2

最后,退出这个方法,局部变量销毁,执行的交换过程虽然是在swapClass方法中,但引用变量传入形参传递的是地址值,意味着,这时的交换操作直接对堆区对象生效,所以最终交换成立:data.a = 4,data.b = 2

综合练习

package com.my.pac05;

public class TransferTest {

public static void main(String[] args) {

TransferTest test = new TransferTest();

test.first();

}

public void first() {

int i = 5;

Value v = new Value();

v.i = 25;

second(v, i);

System.out.println(v.i);

}

public void second(Value v, int i) {

i = 0;

v.i = 20;

Value val = new Value();

v = val;

System.out.println(v.i + " " + i);

}

}

class Value {

int i = 15;

}

//运行结果

15 0

20

整个过程的内存图显示:

41f05d9cbea04dc16e4c9af6fad66b1e.png

总结

方法不能修改基本数据类型的参数,他们改变的仅仅是他们的拷贝。

方法可以改变对象参数的状态,因为方法可以通过对象引用的拷贝修改对象状态。

方法不能让对象参数引用一个新的对象,方法得到的永远都是拷贝值。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持云海天教程。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值