1.形参与实参
Java中定义方法时,是可以定义参数的,在程序语言中,参数分为:'实际参数'和'形式参数'
实际参数:在调用有参函数时,主调函数和被调函数之间有数据传递关系。在主调函数中调用函数时,函数名后面括号中的参数称为实际参数
形式参数:是在定义函数名和函数体的时候使用的参数,目的是用来接收调用该函数时传入的参数,称之为形式参数
例如:
public class Test {
public static void main(String[] args) {
int num = 10;
change1(num);//num为实际参数
}
public static void change1(int a) {//a为形式参数
a++;
}
}
2.值传递与引用传递的区别
当我们调用一个有参函数的时候,会把实际参数传递给形式参数。但是,在程序语言中这个传递过程中的两种传递情况,即是 '值传递'和'引用传递'
'值传递(pass by value)'是指在调用函数时将实际参数复制一份传递到函数中,这样在函数中如果对参数进行修改,将不会影响到实际参数;
'引用传递(pass by reference)'是指在调用函数时将实际参数的地址直接传递到函数中,那么在函数中对参数所进行的修改,将影响到实际参数;
3.Java中是值传递还是引用传递?
众所周知,Java中只有值传递,but why?
上代码!!!
public class Test {
public static void main(String[] args) {
int num = 10;
change1(num);
System.out.println("main方法中的值:" + num);
}
public static void change1(int a) {
a++;
System.out.println("change1方法中的值:" + a);
}
}
如上代码执行后的结果为:

由此可见,num传入change1方法中后,num的值未改变,所以Java是值传递......
这就完了??
NoNoNo !!
我们再举一个例子:
public class Test {
public static void main(String[] args) {
LiuUser liu = new LiuUser();
liu.setUsername("刘旭涛");
change2(liu);
System.out.println("mian方法中的值:" + liu.getUsername());
}
public static void change2(LiuUser user) {
user.setUsername("刘啦啦啦啦啦啦啦啦");
System.out.println("change1方法中的值:" + user.getUsername());
}
}
如上代码执行后的结果为:

'惊!!居然改变了实际参数的值!!'
why???
让我们来分析一波:
首先第一个案例中,‘int num = 10’ 为基础数据类型,其'引用'和'对象'都存储在'栈内存'中
值传递是将‘10’复制一份副本,传入到change1方法内,对‘副本’进行了操作,可以想象成将游离状态的副本进行了操作,
所以对‘num’没有影响。

那为啥第二个例子中的值就产生了改变呢?
我们先来看看两个例子的区别,很显然,第一个例子的参数为'基本数据类型',第二个例子中的参数为'引用数据类型'
我们知道,基本数据类型变量(引用)和值(对象)都存储在'栈'中,但是引用数据类型的引用在'栈'中,对象是在'堆'中的,是由引用'指向'对象的
而当'引用数据类型'作为参数时,同样是复制了副本给形参,但是这里复制的副本是:'引用'

这时,'实参liu'和'形参user'同时指向同一个对象
因为在change1方法中,咱们的'形参user'的地址没有发生任何影响,所以对'形参user的对象'操作会同时影响'实参liu的对象'
其实到这里,还有最后一个疑问。。。就是
既然参数是'引用数据类型'的时候,复制的副本是'引用',那是不是可以理解成:参数为'引用数据类型'时,Java就变成了'引用传递'呢??
答案是:非也
且看下面这个例子:
public class Test {
public static void main(String[] args) {
LiuUser liu = new LiuUser();
liu.setUsername("刘旭涛");
change1(liu);
System.out.println("mian方法中的值:" + liu.getUsername());
}
public static void change1(LiuUser user) {
user = new LiuUser();
user.setUsername("刘啦啦啦啦啦");
System.out.println("change1方法中的值:" + user.getUsername());
}
}
这个例子中,将'实参liu'作为参数传入change1方法中,方法中对'对象地址'进行变动(user = new LiuUser();)
结果是:

由此可见!当'change方法'中对参数的地址值进行改变时,并不会影响'原实参'的地址值
倘若是'引用传递'的话,'change方法'中对参数的地址值进行改变时,应该是会影响'原实参'的地址值的
因此,参数为'引用数据类型'时,Java依旧是'值传递',而这个'值'则是'副本引用(副本地址值)',而不是真正的'原引用'
所以,在Java中只有'值传递'~