这篇文章将为大家详细讲解有关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
整个过程的内存图演示:
如图所示:
在堆内存中创建 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
整个过程的内存图显示:
如图所示:
在堆内存中创建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
整个过程的内存图显示:
1.SpringMVC,Spring Web MVC是一种基于Java的实现了Web MVC设计模式的请求驱动类型的轻量级Web框架。2.Shiro,Apache Shiro是Java的一个安全框架。3.Mybatis,MyBatis 是支持普通 SQL查询,存储过程和高级映射的优秀持久层框架。4.Dubbo,Dubbo是一个分布式服务框架。5.Maven,Maven是个项目管理和构建自动化工具。6.RabbitMQ,RabbitMQ是用Erlang实现的一个高并发高可靠AMQP消息队列服务器。7.Ehcache,EhCache 是一个纯Java的进程内缓存框架。
关于Java中方法参数传递机制的原理是什么就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。
亿速云「云服务器」,即开即用、新一代英特尔至强铂金CPU、三副本存储NVMe SSD云盘,价格低至29元/月。点击查看>>
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。