在招聘网站做销售技巧,济南asp网站制作公司,wordpress如何降级,创建网站的好处#x1f389; 前言
之前一直以为Java传对象是引用传递#xff0c;直到最近用Java写数据结构链表时遇到一些问题#xff0c;这才让我重新思考这个问题#xff0c;经过我的一番研究#xff0c;发现不能一棒子打死#xff0c;其实这其中既有值传递#xff0c;又有引用传递… 前言
之前一直以为Java传对象是引用传递直到最近用Java写数据结构链表时遇到一些问题这才让我重新思考这个问题经过我的一番研究发现不能一棒子打死其实这其中既有值传递又有引用传递让我们往下看。 引用传递的情况
之前一直认为是引用传递是因为我的使用场景大多数是修改对象的属性就像下面这段代码
class LinkNode{int val;LinkNode next;LinkNode(){}LinkNode(int val,LinkNode next){this.val val;this.next next;}
}class Main{public static void main(String[] args) {LinkNode L new LinkNode(666,null);System.out.println(传参之前,L.valL.val);Fun(L);System.out.println(传参之后,L.valL.val);}static void Fun(LinkNode L){L.val 999;}
} 像这样在一个函数的参数列表中传入一个对象并且在函数内部修改传入对象的属性会发现在函数外部的对象属性也发生了变化这就是典型的引用传递。 值传递的情况
class LinkNode{int val;LinkNode next;LinkNode(){}LinkNode(int val,LinkNode next){this.val val;this.next next;}
}class Main{public static void main(String[] args) {LinkNode L new LinkNode(666,null);System.out.println(传参之前,L.valL.val);Fun(L);System.out.println(传参之后,L.valL.val);/* 新增代码 */Fun2(L);System.out.println(传参之后,L.valL.val);}static void Fun(LinkNode L){L.val 999;}/* 新增代码 */static void Fun2(LinkNode L){LinkNode l new LinkNode(111,null);L l;}
}
这段代码在原先代码的基础上增添了Fun2函数代码中也注释了新增的部分此时如果我们沿用之前的观点认为传对象是引用传递那么在 Fun2(L) 函数内部L l这条语句将对象L的引用更改了那么在函数外部的L的引用应该也要更改那么此时打印 L.val应该是111才对但是实际运行结果如图 可见引用的修改只在函数内部成立在外部不成立要想修改函数外部L的引用必须在函数内部手动返回L并将其赋值给函数外的L着不就是妥妥的值传递吗 解释
先说结论传对象就是“值传递”。
其实要解释“引用传递“的假象也很简单我们传入对象实际上传的是对象的引用的副本也就是值传递但是这个副本和原对象指向的同一个内存空间因此借助副本修改对象的属性和使用原对象修改对象的属性是完全等效的因为操作的是同一个内存空间。
但是如果我们在函数内部直接对对象的副本进行赋值就不会影响原对象因为二者的内存空间不是同一个。
由此可见对象虽然是引用数据类型但是传入函数中依然是值传递因此我们要明确在函数内部操作的内存空间和函数外对应的内存空间是不是一致的只有一致的情况下在函数内的修改才会影响函数外否则不影响。