class PassParam
{
int x;
public static void main(String[] args)
{
PassParam obj = new PassParam();
obj.x = 5;
change(obj);
System.out.println(obj.x);
} public static void change(PassParam obj)
{
obj = new PassParam();
obj.x = 3;
System.out.println(obj.x);
}
}
这段代码的红色打印出来应该是5,蓝色打印出来应该是3,单个打印都没错,但一块打印时却是5和3,
清高手指点!
谢谢啊
{
int x;
public static void main(String[] args)
{
PassParam obj = new PassParam();
obj.x = 5;
change(obj);
System.out.println(obj.x);
} public static void change(PassParam obj)
{
obj = new PassParam();
obj.x = 3;
System.out.println(obj.x);
}
}
这段代码的红色打印出来应该是5,蓝色打印出来应该是3,单个打印都没错,但一块打印时却是5和3,
清高手指点!
谢谢啊
方法使obj指向了和原来不同的地方,所以两个obj就不是代表同一个实例了。
如果把change()方法中的obj = new Passparam();去掉,则都为3了。
----------------------------因为你的main()方法以及change(PassParam obj)方法分别实例化了一次
PassParam obj 对象,相当于分配了不同的内存,假设main()中的实例化对象分配的内存叫1
change(PassParam obj)中实例化分配的内存叫2main()中,你先给1的对象赋值为5,即obj.x = 5;那么,当你在main()中分配好1之后,调用了change(obj),这时change(obj)方法中
obj = new PassParam()又分配了2 (此时,1和2引用的不是一个内存地址),
这时obj.x = 3意为你给2的对象赋值为3,此时的输出即为3在main()方法中执行完change(obj)后,紧接着执行的是System.out.println(obj.x)
这时的obj是1的对象,因为之前所赋值为5,所以此时输出的即为5
main方法中先调用了change方法,在执行红色的语句。
蓝色语句在change方法中,所以先掉用蓝色语句
在change方法里面输出了3,main里面输出了5.有什么好奇怪的?
{
int x;
public static void main(String[] args)
{
PassParam obj = new PassParam();
obj.x = 5; //一个obj入栈了
change(obj);//调用 change
System.out.println(obj.x);//这是栈中还是你初次new的那个obj 所以还是5
}//main结束了 main的obj也结束了。public static void change(PassParam obj)
{
obj = new PassParam();//这里你又new了一个 所以可以想象一个新的对象obj压在了上一个main中的obj的上面
obj.x = 3;//新对象的x被你复制为3
System.out.println(obj.x);//输出的是栈顶的obj的x
}//change结束 这个新new的obj的生命结束了。
} 3,5写的不好,有不对的地方请见谅
obj.x = 5;
change(obj); //先调用了change()这个功能块,这个功能里输出了3。
System.out.println(obj.x); //这里输出了5。 所以按顺序应该是先输出3,然后输出5,答案不错吧?不知道这样解释对不对