从leetcode 88题 思考Java中引用与传值问题
函数如下 给定nums1与nums2 将两个数组合并并将结果放到nums1中。
public void merge(int[] nums1, int m, int[] nums2, int n) {
int[] tar=new int[m+n];
int count=0;
int i=0;
int j=0;
while(count<(m+n)) {
if(nums1[i]>=nums2[j]||i>=m) {
tar[count]=nums2[j];
count++;
j++;
}else if(nums1[i]<nums2[j]||j>=n) {
tar[count]=nums1[i];
i++;
count++;
}
}
nums1=tar.clone();
for(int xx=0;xx<tar.length;xx++) {
nums1[xx]=tar[xx];
}
}
如上述代码块 当我得到目标tar数组后 将tar赋给nums1数组后 发现nums1数组并未改变。
(因为之前都习惯 return 回去 或者一些其他解决方法 所以之前未对此问题想过太多)
最后测试 传值
public void changer(int x) {
x=10;
System.out.println("函数中修改:"+x);
}
//main中
int a=0;
System.out.println("a: "+a);
h.changer(a);
System.out.println("a1: "+a);
最后输出结果:
a: 0
函数中修改:10
a1: 0
但Java中没有C中的引用与传值方式。且Java参数传递只有传值方式
传值即:在函数传值过程中 在函数外改变他的值。只有引用会改变。
1.java只有按值传递,所谓的按地址(引用)传递,也属于按值传递,只不过这个“值”是个地址;
2.对于引用类型的传参也是传值的,传的是引用类型的值,其实就是对象的地址;
1.java参数是传递值的。
2.java所有对像变量都是对像的引用;
3.或者说:传递过去的都是拷贝,区别在于拷贝的是基本数据类型还是引用;
4.函数的形式参数,是传入参数的拷贝;引用变量之间拷贝的是【地址】,基本变量之间拷贝的是 内存中的值 (被称为直接量);
7.对象本身,与对象的地址 是2个东西,函数之间如果想【传递对象】,只能通过传递对象的地址来实现;
下次再写 关于上述函数问题的解决