只有传值!!
关于[b]基本类型[/b]。传递的是值,这个值怎么理解,代码中的i只是一个值的提供者,他仅仅负责提供一个值,这个值是10,相对于modifyPoint()他就没什么用了,他自己不会搭进去,换种想法,无论什么提供者,就是能产生值而已,就这么点功能,夸张的说,你本人跑程序里,提供个值,你又跑出来,值让人家用着,和你没关系,所以这个提供者是什么都不要紧,关键的是这个值。
代码中反应就是main中的i未发生改变,还是10.许多人都说这是i的副本传进去了,不知道官方有没有这种说法,但是这样的说法我认为非常贴切,可以更好的理解传值。
关于[b]对象类型[/b]。对象的传递分歧就多了,这个误解源于[quote]【所有的java objects 都是 object references】这一事实。引用自Peter·Haggar[/quote],回到程序中,传递进modifyPoint()方法是值,是什么值?引用的值,而不是对象的值,用副本来说,就是引用的副本,而不是对象的副本,[quote]【java以by value方式传递object references】[/quote],什么是引用的值,引用中存的是对象的内存地址!地址就是引用的值,地址干什么用?指向引用的对象!所以p和pt指向相同的对象,pt改变了对象的值,那么p所引用的对象也受影响.
和基本类型有一些区别,对象类型传值,p也只是值的提供者,和他本身无关,他自身是引用吗,但是与他引用的对象有关,他把值(地址)的副本传递进去了,这个玩意可以找到对象啊,所以相应的对象也改变了。
modifyPoint()一直在和同一个对象打交道。[b]如果不想在modifyPoint中改变Point对象,2种方法可以。[/b]
(1)对modifyPoint()传递一个Point对象的克隆版本。
modifyPoint()方法传入的形参改变了
(2)令Point对象成为immutable(不可变的)。
import java.awt.Point;
public class PassByValue
{
public static void main(String[] args)
{
Point p = new Point(0,0);
int i=10;
System.out.println("修改之前是: p="+p+"i="+i);
modifyPoint(p, i);
System.out.println("修改完是: p="+p+"i="+i);
}
public static void modifyPoint(Point pt,int j)
{
pt.setLocation(5, 5);
j=15;
System.out.println("在modifyPoint方法中 pt="+pt+"j="+j);
}
}
结果:
修改之前是: p=java.awt.Point[x=0,y=0]i=10
在modifyPoint方法中 pt=java.awt.Point[x=5,y=5]j=15
修改完是: p=java.awt.Point[x=5,y=5]i=10
关于[b]基本类型[/b]。传递的是值,这个值怎么理解,代码中的i只是一个值的提供者,他仅仅负责提供一个值,这个值是10,相对于modifyPoint()他就没什么用了,他自己不会搭进去,换种想法,无论什么提供者,就是能产生值而已,就这么点功能,夸张的说,你本人跑程序里,提供个值,你又跑出来,值让人家用着,和你没关系,所以这个提供者是什么都不要紧,关键的是这个值。
代码中反应就是main中的i未发生改变,还是10.许多人都说这是i的副本传进去了,不知道官方有没有这种说法,但是这样的说法我认为非常贴切,可以更好的理解传值。
关于[b]对象类型[/b]。对象的传递分歧就多了,这个误解源于[quote]【所有的java objects 都是 object references】这一事实。引用自Peter·Haggar[/quote],回到程序中,传递进modifyPoint()方法是值,是什么值?引用的值,而不是对象的值,用副本来说,就是引用的副本,而不是对象的副本,[quote]【java以by value方式传递object references】[/quote],什么是引用的值,引用中存的是对象的内存地址!地址就是引用的值,地址干什么用?指向引用的对象!所以p和pt指向相同的对象,pt改变了对象的值,那么p所引用的对象也受影响.
和基本类型有一些区别,对象类型传值,p也只是值的提供者,和他本身无关,他自身是引用吗,但是与他引用的对象有关,他把值(地址)的副本传递进去了,这个玩意可以找到对象啊,所以相应的对象也改变了。
modifyPoint()一直在和同一个对象打交道。[b]如果不想在modifyPoint中改变Point对象,2种方法可以。[/b]
(1)对modifyPoint()传递一个Point对象的克隆版本。
modifyPoint()方法传入的形参改变了
modifyPoint((Point)p.clone(), i);
修改之前是: p=java.awt.Point[x=0,y=0]i=10
在modifyPoint方法中 pt=java.awt.Point[x=5,y=5]j=15
修改完是: p=java.awt.Point[x=0,y=0]i=10
(2)令Point对象成为immutable(不可变的)。
final Point p = new Point(0,0);
修改之前是: p=java.awt.Point[x=0,y=0]i=10
在modifyPoint方法中 pt=java.awt.Point[x=5,y=5]j=15
修改完是: p=java.awt.Point[x=5,y=5]i=10