这几天需要把原来用VC写的一个计算弧垂的代码用Java改写,供系统的BS调用。原来没有用过Java,遇到了一些问题,例如容器的声明中不允许用基本数据类型、deep clone中的ArrayList问题等等。今天又遇到一个问题,解决后不知道自己的理解是否正确,记下来也请大家帮忙指正。
问题是起初认为虽然基本数据类型int不能把改变后的参数传递出来,但是类类型Integer应该是可以的。其实不是这样的。因为Java中的传递是按值传递(有争议,但是可以搁置,不理它),对于基本数据类型和C++是一样的;对于类类型,传递的是对象的指针(句柄)地址(Java中是有指针的),针对Integer类型来说,如果要改变其值,只能new一个新的对象,即使用=直接赋值,Java也会声明一个新的对象的。在方法中修改对象的地址的值,这个值作为参数是不会被改变的。而郁闷的是Integer对象又没有一个可以改变其成员的地方,所以只好作为返回值来传递。如果有多个Integer类型的对象需要传递呢?请使用数组吧。这一点上感觉Java不方便,虽然Java没有头文件让人很爽。
下面是我做测试的代码,上面的图片(用图片是因为我不会在blogger中排版Java格式,谁教我?)中的代码应该更美观,可以点击放大。
public class ParaChange
{
public ParaChange()
{
i = 0;
}
public void Change(int iPara)
{
iPara = 9;
}
public void Change(Integer iObjPara)
{
iObjPara = new Integer(9);
}
public void Change(ParaChange pc)
{
ParaChange newpc = new ParaChange();
newpc.i = 9;
pc = newpc;
}
public void Change0(ParaChange pc)
{
pc.i = 9;
}
private int i;
public static void main(String[] args)
{
ParaChange pc = new ParaChange();
int index = 0;
pc.Change(index); // 显而易见,不会改变参数的值;和C++一样
System.out.println(index); // 0
Integer Iindex = new Integer(0);
pc.Change(Iindex); // 传入的是对象iObjPara的地址。地址的值不会被改变,
//
问题是起初认为虽然基本数据类型int不能把改变后的参数传递出来,但是类类型Integer应该是可以的。其实不是这样的。因为Java中的传递是按值传递(有争议,但是可以搁置,不理它),对于基本数据类型和C++是一样的;对于类类型,传递的是对象的指针(句柄)地址(Java中是有指针的),针对Integer类型来说,如果要改变其值,只能new一个新的对象,即使用=直接赋值,Java也会声明一个新的对象的。在方法中修改对象的地址的值,这个值作为参数是不会被改变的。而郁闷的是Integer对象又没有一个可以改变其成员的地方,所以只好作为返回值来传递。如果有多个Integer类型的对象需要传递呢?请使用数组吧。这一点上感觉Java不方便,虽然Java没有头文件让人很爽。
下面是我做测试的代码,上面的图片(用图片是因为我不会在blogger中排版Java格式,谁教我?)中的代码应该更美观,可以点击放大。
public class ParaChange
{
public ParaChange()
{
i = 0;
}
public void Change(int iPara)
{
iPara = 9;
}
public void Change(Integer iObjPara)
{
iObjPara = new Integer(9);
}
public void Change(ParaChange pc)
{
ParaChange newpc = new ParaChange();
newpc.i = 9;
pc = newpc;
}
public void Change0(ParaChange pc)
{
pc.i = 9;
}
private int i;
public static void main(String[] args)
{
ParaChange pc = new ParaChange();
int index = 0;
pc.Change(index); // 显而易见,不会改变参数的值;和C++一样
System.out.println(index); // 0
Integer Iindex = new Integer(0);
pc.Change(Iindex); // 传入的是对象iObjPara的地址。地址的值不会被改变,
//
所以对象的值也不会被改变
System.out.println(Iindex.toString()); // 0
ParaChange pcOther = new ParaChange();
pc.Change(pcOther); // 和Integer对象类似,不会改变
System.out.println(pcOther.i); // 0
pc.Change0(pcOther); // 改变对象成员的值,OK!可以被改变
System.out.println(pcOther.i); // 9
}
}
System.out.println(Iindex.toString()); // 0
ParaChange pcOther = new ParaChange();
pc.Change(pcOther); // 和Integer对象类似,不会改变
System.out.println(pcOther.i); // 0
pc.Change0(pcOther); // 改变对象成员的值,OK!可以被改变
System.out.println(pcOther.i); // 9
}
}
没有评论:
发表评论