Java方法的形参和实参
- 形参
- 实参
- 传值调用
- 传引用调用
- 总结
形参与实参对应两种类型:值类型与引用类型
- 值类型:包括8种基本类型(byte、short、int、long、double、float、char、boolean)+ String
- 引用类型:数组、类、接口等类型。
- 为值类型时,形参方法内的参数值改变,并不会影响到实参的值。
- 为引用类型时,形参方法内的参数值改变时,会影响到实参的值。注意是地址所指向的堆中的值,如果形参的地址改变了,那么这个改变不会影响到实参。
用来接收调用方法时传递的参数。只有在被调用的时候才分配内存空间,一旦调用结束,就释放内存空间。因此仅仅在方法内有效。
public void swap(int a, int b) {
int temp = a;
a = b;
b = temp;
System.out.println("a:" + a + " b:" + b);
}
这里边的a,b就是形参,temp是一个局部变量,方法结束,在栈空间中就会被销毁
实参
传递给被调用方法的值,预先创建并赋予确定值。
- 调用上面的
- swap(1,2);
- 其中1和2就是实际的参数值,就叫实参
传值调用中传递的参数为基本数据类型,参数视为形参。
public class Transform {public static void main(String[] args) {
int i = 10;
int j = 5;
System.out.println("i: " + i + ", j: " + j);
Transform.swap(i, j);
System.out.println("i: " + i + ", j: " + j);
}private static void swap(int a, int b) {
int temp = a;
a = b;
b = temp;
System.out.println("a: " + a + ", b: " + b);
}}
这里我们写了一个实现两个 int 型数据交换的方法,并且在 main() 方法中调用,然而结果却并不是我们想要的。
运行结果如下图所示:
文章图片
就是因为基本数据类型是属于传值调用,当我们要实现交换时,方法内可以完成交换,只是形参进行了交换,方法结束,栈空间中就会销毁 swap() 方法内的局部变量,所以当调用 swap() 时,最终值还是实参的初始化值,并没有被修改。值改变作用到了形参,而不会作用到实参。
传引用调用
传引用调用中,如果传递的参数是引用数据类型,参数视为实参。在调用的过程中,将实参的地址传递给了形参,形参上的改变会影响到实参。
/*
参数传递:
形参:方法声明时,方法小括号内的参数
实参:调用方法时,实际传入的参数值
java中传递值得机制:
形参是基本数据类型的: 将实参的值传递给实参的基本数据类型的变量
形参是引用数据类型的: 将实参的引用类型的值(即在堆空间中生成的首地址的值)传递给形参的引用类型的变量
*/
public class Test {public static void main(String[] args) {
Test t = new Test();
Data data = https://www.it610.com/article/new Data();
System.out.println("data.i: " + data.i + ", data.j:" + data.j);
// 调用
Test.swap(data);
System.out.println("data.i: " + data.i + ", data.j:" + data.j);
}private static void swap(Data data) {
int temp = data.i;
data.i = data.j;
data.j = temp;
}
}class Data {
int i = 10;
int j = 5;
}
【Java|Java方法的形参和实参】形参部分直接传进去了一个对象,相当于堆空间的首地址值得引用
运行结果:
文章图片
总结
- java的基本数据类型是传值调用,引用类型是传引用调用;
- 当传值调用时,改变的是形参的值,并没有改变实参的值,实参的值可以传递给形参,但是,这个传递是单向的,形参不能传递回实参;
- 当传引用调用时,如果参数是对象,无论对对象做了何种操作,都不会改变实参对象的引用,但是如果改变了对象的内容,就会对应改变实参对象的内容。
推荐阅读
- Mybatis|Mybatis动态SQL
- #|必踩的坑之Java方法中形参、实参传递
- python|嵌入式软件工程师升职_我刚升职的软件工程师在第一年学到的5课
- 算法|软件工程师 算法工程师_采访100多位软件工程师后的建议
- java|实施工程师1分钟即时演讲_我是如何在1年内从时装模特转变为软件工程师的
- java|Java五年,已财富自由,美人在手!
- Java|Tomcat 配置SSL证书 实现HTTPS访问 - 伪证书
- 大数据|极客日报(小米回应造车传闻;饿了么就春节“套路”骑手活动致歉;苹果研发 iPhone12 无线充电电池组...)
- java|JVM性能调优~JVM内存整理及GC回收