测试代码如下:
public class T180807 {
// 包装类测试,以Integer为例
public static void main(String[] args) {
// 当创建范围为[-128,127]时
Integer a = 1;
Integer b = 1;
Integer c = new Integer(1);
System.out.println("a == b :" + (a == b));
System.out.println("a == c :" + (a == c));
System.out.println();
// 当创建范围不为[-128,127]时
Integer d = 128;
Integer e = 128;
Integer f = new Integer(128);
System.out.println("d == e :" + (d == e));
System.out.println("d == f :" + (d == f));
System.out.println("d e f 互不相等(false为正确测试结果):" + (d == e || d == f || e == f));
System.out.println();
// 包装类均为值传递
Integer g = 0;
Integer h = new Integer(130);
Test1(g);
Test2(h);
System.out.println("g = "+g);
System.out.println("h = "+h);
}
static void Test1(Integer t) {
t = 1;
System.out.println("Test1内: t = " + t);
}
static void Test2(Integer t) {
t = 131;
System.out.println("Test2内: t = " + t);
}
}
测试结果如下:
a == b :true
a == c :false
d == e :false
d == f :false
d e f 互不相等(false为正确测试结果):false
Test1内: t = 1
Test2内: t = 131
g = 0
h = 130
本次包装类测试,以Integer类为例,其他包装类均类似
当Integer类对象创建范围在[-128,127]时,若未用new方法对引用进行初始化(eg. Integer a = 1;),则其在堆栈中的情况是这样的:
当采用new方法进行初始化时:
所以其结果为:
a == b :true
a == c :false
当Integer类对象创建范围不为[-128,127]时,若未用new方法,即:
Integer d = 128;
Integer e = 128;
其在堆栈中的情况是这样的:
采用new方法时:
由此可以看出,当Integer类对象创建范围不为[-128,127]时,不论是否采用new方法均要在堆内开辟一块空间存放其值。
也可以得出测试结果:
d == e :false
d == f :false
d e f 互不相等(false为正确测试结果):false```
最后,包装类的参数传递的运行效果是值传递的效果,可以从运行代码看出:
在方法内部对其对象值的修改,并不会对其本身产生影响
(但是其本质上传递的是地址,只是因为包装类和String类内部的value均以final修饰,一旦被赋值就不可被改变,故表现出来的是值传递的效果)
Integer g = 0;
Integer h = new Integer(130);
Test1(g);
Test2(h);
System.out.println("g = "+g);
System.out.println("h = "+h);
static void Test1(Integer t) {
t = 1;
System.out.println("Test1内: t = " + t);
}
static void Test2(Integer t) {
t = 131;
System.out.println("Test2内: t = " + t);
}
运行结果:
Test1内: t = 1
Test2内: t = 131
g = 0
h = 130