java 传值的一个小问题

来源:百度知道 编辑:UC知道 时间:2024/05/28 20:14:58
public class Text
{
//static int x = 6;
public static void main(String[] agrs)
{
Integer x=6;// = 6;
Text p = new Text();
p.doStuff(x);
System.out.print("main" + x);
}
public void doStuff(Integer x)
{

System.out.print("doStuff" + x++);
}
}

Integer x 这里应该是一个引用吧,这不是基本数据类型,但是为什么System.out.print("main" + x);
这里还是输出main6?

在1.5以后java引入了自动装箱和自动拆箱的功能.

即随着使用状况的不同自动切换基本数据类型和其封装类

其实楼主应该注意的是x++这一步.
如果是Integer的话是不支持运算符的

在这里就进行了一步自动拆箱x对应的是其int的类型,所以才能进行++操作.

根据++前缀和后缀的不同
因此这里打印的应该是doStuff6

public class Text
{
//static int x = 6;
public static void main(String[] agrs)
{
Integer x1=6;// = 6;
Text p = new Text();
p.doStuff(x1);
System.out.print("main" + x1);
}
public void doStuff(Integer x2)
{

System.out.print("doStuff" + x2++);
}
}
为清楚起见将两个x分别标示为x1和x2

之所以x1的值前后没有发生改变的根本原因在于Integer是一个非可变类,也就是比如x++操作并不是在x的基础上进行修改,而是产生了一个新的比之前的值大1的新的Integer对象.

在程序中x1和x2是两个指向同一个Integer对象的不同引用,因此x2++操作相当于通过++操作获得了一个新Integer对象7,并用x2指向该对象..x1仍然指向之前的对象6.因此x1的值前后并没有发生变化.

Integer 可以自动封装和 解封

这里是自动调用了x的toString方法。

理解这里的关键是区分对象和引用。 这里声明的 x 是一个引用,而不是一个对象(只是Java把它设计为看上去好像是对象一样)。这个引用它指向了一个对象,这个对象就是后面用 new 关键字生成的对象。因此,可以说