深入理解java的基本类型、引用类型以及传参问题
代码如下
Te类中
package com.test213;
public class Te {
public String name;
public int age;
}
Test类中
package com.test213;
public class Test {
public static void main(String[] args) {
Te a = new Te();
Te b = a;
a.name = "123";
a.age = 90;
int num = 100;
Integer NUM = 100;
change0(num);
change0(a);
change0(NUM);
System.out.println(a.name); //wbs
System.out.println(a.age); //99
System.out.println(num); //100
System.out.println(NUM); //100
}
public static void change0(Te a1) {
a1.name = "wbs";
a1.age = 99;
}
public static void change0(int a1) {
a1 = 99;
}
public static void change0(Integer a1) {
a1 = 99;
}
}
输出结果
分析一下输出结果
第一个输出wbs,第二个输出99;
Te a = new Te();执行这句代码时,堆内存中分配空间给Te()类。同时a指向Te();
public static void change0(Te a1) {
a1.name = "wbs";
a1.age = 99;
}
传参时 将a中记录的地址传给了a1,此时a 和 a1指向的堆内存是同一块。
这时候改变a1.name,a1.age就相当于改变了a.name,a.age
第三个输出100,第四个输出100;两个不同的是 一个int类型一个integer类型。(int和Integer类型的值在经过函数调用之后值未被改变这是为什么呢?
1.int:
大家都知道,java有八个基本类型,int就是其中的一类;在传参的时候,基本类型的参数都是深复制,也就是说在函数里被改变值的变量不是原来的变量num,而是经过深复制的a1,在函数结束时,a1被释放,从头到尾,原变量num都没有被改变过,所以输出num仍为原值100。
2.Integer:
Integer也是引用类型,但它的结果却和int一样。因为Integer的源码中对int变量的定义是final类型的,值是不能被改变的,而且在函数调用的装箱过程中,调用的是Integer的ValueOf()函数,在这个函数的源码中,返回值是new的一个新对象,所以Integer在传参的时候也是深复制。
对于类的交换问题
代码如下
package com.test213;
public class Test {
public static void main(String[] args) {
Te aa = new Te();
aa.age = 100;
Te bb = new Te();
bb.age = 60;
change(aa,bb);
System.out.println(aa.age);
System.out.println(bb.age);
change2(aa,bb);
System.out.println(aa.age);
System.out.println(bb.age);
}
public static void change(Te a1,Te b1) {
Te temp;
temp = a1;
a1 = b1;
b1 = temp;
}
public static void change2(Te a1,Te b1) {
Te temp = new Te();
temp.age = a1.age;
a1.age = b1.age;
b1.age = temp.age;
}
}
public static void change(Te a1,Te b1) {
Te temp;
temp = a1;
a1 = b1;
b1 = temp;
}执行这句是图如下 aa,bb指向不会变
public static void change2(Te a1,Te b1) {
Te temp = new Te();
temp.age = a1.age;
a1.age = b1.age;
b1.age = temp.age;
}
这才是真正实现交换的代码