1.引子:变量的赋值
对于基本数据类型
int m = 1;
int n = 2;
System.out.println("m = " + m);
System.out.println("n = " + n);
n = m;
System.out.println("n = " + n);
输出
m = 1
n = 2
n = 1
赋的值就是变量值。
对于引用类型
class User{
int a;
}
User u1 = new User();
u1.a = 1;
User u2 = u1;
System.out.println("u1中的a为" + u1.a + "," + "u2中的a为" + u2.a);
u2.a = 2;
System.out.println("u1中的a为" + u1.a + "," + "u2中的a为" + u2.a);
输出
u1中的a为1,u2中的a为1
u1中的a为2,u2中的a为2
赋的值是地址值。
有同学可能会对第二个有疑问,这里我来画个简陋的内存解析来帮助理解一下。
第5行代码,new了一个User对象,存放在堆空间中,a的初始值为0.而u1这个局部变量存储在栈中,u1的值为User对象的地址值0x333
第6行代码,u1修改了a的值,即a变成1
第7行代码,栈中来了一个u2,将u1的地址值赋给了u2,所以u2的值也为0x333
第9行代码,u2修改了a的值,即a变成2
2.值传递机制
首先要明确,这个是主要体现在方法的调用上,也就是针对于方法中的形参与传递给它的实参而言。
方法中形参的传递机制:值传递
(1) 如果参数是基本数据类型,实参传递给形参的是真实存储的数据值
(2) 如果参数是引用类型,实参传递给形参的是地址值
举个例子,交换 a a a 与 b b b 的值,有如下一 s w a p swap swap函数
void swap(int a,int b){
int t = a;
a = b;
b = t;
}
如果此时调用该函数,能起到交换作用吗?
int x = 1;
int y = 2;
swap(x,y);
答案是不会的!这里还是拿简陋的内存图来解析一下
可以看出, s w a p swap swap 交换的仅仅只是它自己方法体内的参数,而不是 x x x 和 y y y ,因为 a a a 和 b b b 只是实参 x x x 和 y y y 的是一个拷贝值。方法结束之后,它们就会被回收掉。
如果我再问,下面的 s w a p swap swap 函数,能起到交换作用吗?
void swap(User a, User b){
User t = a;
a = b;
b = t;
}
User u1 = new User();
User u2 = new User();
swap(u1,u2);
class User{
}
答案依然是不会!
可以看到,我一顿操作,蓝色箭头丝毫没有受到影响。
那要怎么才能完成交换呢?这时候回到引子里面的对于引用类型的变量赋值,能找到一些答案。
void swap(int[] array,int a,int b){
int t = array[a];
array[a] = array[b];
array[b] = t;
}
这样的一个交换函数,就能起到交换作用了!
int[] h = {1,2};
swap(h,0,1);
System.out.println(h[0] + "," h[1]);
输出
2,1
也就是说,一个方法不能修改一个基本数据类型的参数,但可以修改一个引用类型所指向的对象的状态。
即传递引用类型的实参的话,形参会获得该实参的地址值,我们可以通过修改形参以达到修改实参的目的。
3.有意思的思考题
(1)
public class Test{
public static void main(String[] args){
int a = 10;
int b = 20;
method(a,b);//调用method方法后,仅打印出a=100,b=200
System.out.println("a="+a);
System.out.println("b="+b);
}
//代码编写处
public static void method(int a,int b){
}
}
(2)
int[] arr = {1,2,3};
System.out.println(arr);
char[] c = {a,b,c};
System.out.println(c);
输出
第二行输出:________
第四行输出:________
答案
(1)
public static void method(int a,int b){
System.out.println("a=" + a*10);
System.out.println("b=" + b*10);
System.exit(0);
}
(2)
a r r arr arr的地址值
a b c abc abc
4.参考资料
(1) 尚硅谷_Java零基础教程-java入门必备-适合初学者的全套完整版教程(宋红康主讲)
更多Java内容欢迎扫码关注我的公众号ACJavaBear,文章第一时间会发在上面。一起学Java吧