参数为基本类型(int/char/…)
public static void main(String[] args){
int a=0;
hs(a);
System.out.println(a);
}
public void hs(int a){
a=77;
}
运行的结果为a=0,也就是调用外部函数没有效果。
个人的理解是:如果是基本类型的话,hs函数里,只是用了一下数值,对主函数里的变量a没有任何影响。
ps:基本类型是值传递,引用类型是地址传递。(修正:Java里只有值传递的概念)
参数为引用类型(List/自定义类/…)
主函数内变量改成:List list=new ArrayList<>(); 或者自定义树的结点: TreeNode t=new TreeNode();
被调用的函数对其进行 list.add()操作,或者t.val=5的操作,运行结果是:生效了
个人理解是:传递的是对象的指针,对该地址上的数据直接进行修改,所以会永久生效。
参数为引用类型(Integer/String/…)
主函数内变量改成:Integer i=0;
被调用的函数对其进行 i=7;的操作。运行结果是?不生效。
个人理解:这也是我迷惑了一晚上的问题。同为引用类型,为什么Integer修改后就不生效呢?实际上,i=7,并不是把原来地址上的数去抹除再改成新的数据。实质上是i=new Integer(7),也就是重新开辟了空间,把指针i重新指向新的空间地址。String比较特殊,String类是被final修饰的,所以是不可被继承的,本质上不允许修改。str="xxx"实质上是编译期间JVM去常量池里找,找到了直接引用,找不到就在常量池开辟空间。运行期间在栈创建指针指向常量池。所以被调用函数中把String类型参数修改为其他内容的话,是在常量池中新开辟了空间并把栈中指针指向了新的空间。
这样的话,原来地址的内容并没有改变,所以主函数里输出i,内容也不会改变了。
ps:Integer i=7 和 Integer i=new Integer(7) 效果基本上一样,都是开辟空间并指向i罢了,略微的区别是如果之前已经定义了i=7,前者会直接把i指向该空间地址,后者则不管三七二十一直接开辟新空间。