形参和实参
java 版
public class TestNum {
public int addNum(int a,int b){
int sum = 0;
sum = a + b;
a = a + 1;
b = b + 1;
System.out.println("形参 a="+ a + ",形参 b=" + b );
return sum;
}
public static void main(String[] args) {
TestNum testNum = new TestNum();
int a = 10;
int b = 10 ;
int sum = testNum.addNum(a, b);
System.out.println("执行方法:传参" + sum);
System.out.println("打印实参的值:" + "a= "+ a + ", b="+ b);
}
}
执行结果
这里的值传递指的就是形参的值(addNum(a,b) 方法中的 a,b就是形参):传递的是值的拷贝,也就是说传递后就互不相关了,因此最后打印 实参的值会发现并没有改变。
引用传递:指的是在方法调用时,传递的参数是按引用进行传递,其实传递的引用的地址,也就是变量所对应的内存空间的地址
public class TestObj {
private void test1(Name str) {
str.name = "WFF";
System.out.println("调用方法(类名.属性): "+str.name);
}
public static void main(String[] args) {
TestObj to = new TestObj();
Name myname = new Name();
myname.name= "small zhou";
to.test1(myname); // 这里传递的参数 myname 就是按引用传递
System.out.println("我的名字是: "+myname.name);
}
}
class Name {
public String name = "无名氏";
}
值发生了改变
注意:Java语言的方法调用只支持参数的值传递
C 语言版
值传递
int main()
{
int n;
printf("input number\n");
scanf("%d",&n);
s(n);
printf("n=%d\n",n);
}
int s(int n)
{
int i;
for(i=n-1;i>=1;i--)
n=n+i;
printf("n=%d\n",n);
}
说明
在主函数中用printf 语句输出一次n 值,这个 n 值是实参 n 的值。
在函数 s 中也用printf 语句输出了一次n 值,这个 n 值是形参最后取得的n 值。
在执行函数过程中,形参 n 的值变为 3。
返回主函数之后,输出实参 n 的值仍为 2。
实参的传值调用值不随形参的变化而变化。
(指针)地址传递
#include <stdio.h>
void Exchg2(int *px, int *py)
{
int tmp = *px;
*px = *py;
*py = tmp;
printf("方法体内的打印:");
printf("*px = %d, *py = %d.\n",*px, *py);
}
main()
{
int a = 1,b = 3;
Exchg2(&a, &b);
printf("调用方法后值的查看:");
printf("a = %d, b = %d.\n", a,b);
return(0);
}
上列使用了指针,因此,调用函数后,main 方法中定义的值发生改变
引用传递
#include <stdio.h>
void Exchg3(int &x, int &y)
{
int tmp = x;
x = y;
y = tmp;
printf("x= %d,y = %d\n", x, y);
}
main()
{
int a = 1,b =3;
Exchg3(a, b);
printf("a= %d, b = %d\n", a, b);
return(0);
}
引用传递与 值传递的区别,在 C 语言中是使用了 & 符号,引用的是地址。
java中的理解
-
值传递和引用传递 :
-
按值传递:就是将该值的副本传过去(基本数据类型+String类型的传递,就是按值传递)
-
按引用传递:就是将值的内存地址传过去(除基本数据类型+String以外类型的传递,就是引用传递)
重要原理
- 形参变量只有在被调用时才分配内存单元,在调用结束时,即刻释放所分配的内存单元。因此,形参只在函数内部有效。函数调用结束返回主调用函数后则不能再使用该形参变量。
-
可以理解为预先赋值的一个变量或者控制台输入等办法使参数获得确定值。
- 实参和形参在数量上,类型上、顺序上应严格一致,否则就会发生类型不匹配的错误,—因此这里很容易理解混乱,造成区分不清。
-
在一般传值调用的机制中只能把实参传送给形参,而不能把形参的值反向地传送给实参。因此在函数调用过程中,形参值发生改变,而实参中的值不会变化。
-
而在引用调用的机制当中是将实参引用的地址传递给了形参,所以任何发生在形参上的改变实际上也发生在实参变量上。
针对 java 来讲就是 值传递和引用传递的概念
针对 C 来说,就是 值传递,和 引用传递,还有地址传递的情况