Java方法参数传递机制原理解析

作者:sumerday 时间:2022-04-16 19:10:46 

这篇文章主要介绍了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

整个过程的内存图演示:

Java方法参数传递机制原理解析

如图所示:

  • 在堆内存中创建 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

整个过程的内存图显示:

Java方法参数传递机制原理解析

如图所示:

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

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

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

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

  5. 最后,退出这个方法,局部变量销毁,执行的交换过程虽然是在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

整个过程的内存图显示:

Java方法参数传递机制原理解析

总结

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

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

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

来源:https://www.cnblogs.com/summerday152/p/12026458.html

标签:Java,方法,参数,传递,机制
0
投稿

猜你喜欢

  • android实现常驻通知栏遇到的问题及解决办法

    2022-10-12 06:06:58
  • 深入委托与多播委托的详解

    2023-05-29 07:07:15
  • idea的使用之关于tomcat热部署的教程

    2022-12-02 20:16:46
  • java8的stream如何取max

    2023-09-06 19:08:37
  • Linux下执行java程序的方法

    2023-01-25 07:22:23
  • C#中使用强制类型实现字符串和ASCII码之间的转换

    2022-05-15 14:57:48
  • java基础的详细了解第八天

    2023-11-08 10:47:47
  • Java的关键字与保留字小结

    2021-05-30 10:20:50
  • 在Unity中使用全局变量的操作

    2022-12-30 13:18:47
  • 详细解读Java Spring AOP

    2022-10-09 11:06:06
  • java实现文件拷贝的七种方式

    2023-07-20 19:01:41
  • 使用C++程序获取新浪行情数据的方法

    2022-06-16 13:14:35
  • java中List接口与实现类介绍

    2022-11-17 02:54:40
  • Android 沉浸式改变小米魅族状态栏颜色的实例代码

    2023-11-18 15:13:16
  • Android仿美团网、大众点评购买框悬浮效果修改版

    2023-10-05 13:12:17
  • Android中的SpannableString与SpannableStringBuilder详解

    2022-03-02 22:04:55
  • SpringCloud Zuul基本使用方法汇总

    2023-11-14 15:21:54
  • Android O添加桌面快捷方式的示例

    2022-12-27 07:53:19
  • Spring与Shiro整合及加载权限表达式问题

    2023-10-01 09:29:50
  • spring boot使用sharding jdbc的配置方式

    2022-02-16 00:29:15
  • asp之家 软件编程 m.aspxhome.com