public class Demo1 {
static int a = 1;
public static void main(String[] args) {
System.out.println(a);
chang(a);
System.out.println(a);
}
static void chang(int a) {
a = 10;
}
}
输出的是什么?
我一开始没留意,直接就被坑了(正确答案是两个1),细节决定成败呀。
基本类型的试过了,那再试试引用类型的。
public class Demo2 {
public static void main(String[] args) {
A a = new A();
System.out.println(a.o);
chang(a);
System.out.println(a.o);
}
static void chang(A a) {
a.o = "hi";
}
}
class A{
String o = "hello";
}
输出了什么?正确答案:hello hi
搞到这里,问题来了,方法的传参传的是什么?方法的传参的运行机制是什么?
我想了好久,才想明白,
我的理解是Demo1的第9行这个 chang(int a) 的意思是方法chang里新定义一个int型的局部变量a,并且把方法调用时传进来的参数拷贝赋值给a。所以这里的 a=10 是给局部变量赋值 并不是类里面的a。其实这个机制我是有意识到的,但从没有仔细去想过这个方法的运行会是怎么样的,一直理所当然,才导致一开始判断失误。
想到这里,就可以浅尝的解释一下方法的重载了,调用方法传参时,会根据传进来的参数与方法 () 内新建的局部变量进行参数类型匹配。
那么Demo2中的引用类型传参也就不难理解了,传进去的就是对象的引用的拷贝。所以Demo2第10行chang(A a)
的意思就是新建一个A类的引用a,然后把传进来的引用赋值给a。相当于
A a;
a = 传进来的引用;
基本数据类型和引用数据类型都试过了,那么改成经常被忽略的引用数据类型String变量会是怎么的结果呢?(盲猜会有人以为String类型是基本数据类型)
public class Demo3{
static String a= "hello";
public static void main(String[] args) {
System.out.println(a);
chang(a);
System.out.println(a);
}
static void chang(String a) {
a="hi";
}
}
输出结果是两个 hello。
身为引用类型的String变量为什么会和基本类型变量一样了?不是说引用类型传进去的是一个引用吗?方法根据引用为什么没有改变变量的值呢?
1 条评论
::WBB:2::