1: public class AClass{
2: public int value;
3: public AClass(int value){
4: this.value = value;
5: }
6: }
01: public class Main {
02: private void modify1(AClass object){
03: object.value = 15;
04: }
05:
06: private void modify2(AClass object){
07: object = new AClass(20);
08: }
09:
10: private AClass modify3(){
11: return new AClass(25);
12: }
13:
14: public static void main (String args[]) {
15: Main main = new Main();
16: AClass object = new AClass(10);
17:
18: System.out.print(object.value);
19: main.modify1(object);
20: System.out.print (object.value);
21: main.modify2(object);
22: System.out.print(object.value);
23: object = main.modify3();
24: System.out.print(object.value);
25: }
26: } 谁能帮我添下注释,解释下为什么它会输出: 10151525
重点是这里的modify1,2,3和object的关系还有作用域。
关于java数据传递方式,从术语上定义,我倾向于pass by value:
a.对于基本数据类型数据,取得的是数据的局域副本;
b.对于对象,取得的是传递的refference的局域副本,同时产生别名(局域副本也指向refference
指向的那个对象)。
解释modify2()得出的值等于15,而不等于20:
取得的是局域副本(refference),所以我们操作的东西就是这个refference,与“原本”毫无关系,
refference也需要存储空间,它的值为指向哪个对象,现在我们可以修改它本的值,让它指向其它对象,
modify2正是这样做的。
modify1的情况不说也很明白了。
把所有的方法形参都改下名字,就好理解了private void modify2(AClass o){
o = new AClass(20);
} 现在:AClass object = new AClass(10);
这时生成一个AClass对象(例如对象ID=20),
那么object就是这个对象的一个引用,也可以说,这个ID=20的对象的名字(在main方法的范围)现在叫object;然后
private void modify1(AClass o){
o.value = 15;
}
main.modify1(object);
object传给了方法modify1,那么,也就是o=object,也就是,在modify1方法中,ID=20这个对象的名字叫 o;
o.value = 15; 那么,也就是,o的属性value(也就是ID=20的对象的属性value)赋新值15;再来看
private void modify2(AClass o){
o = new AClass(20);
}
main.modify2(object); 还是object传给了方法modify1,那么,也就是o=object,也就是,在modify2方法中,ID=20这个对象的名字叫 o;
(上面和modify1是一样的,但是,这些都是在o = new AClass(20); 语句之前的状态;)o = new AClass(20); 之后,o这个名字发生了变化,新生成了一个AClass对象(ID=88),然后,这个ID=88的对象“抢夺”了o这个名字,在modify2中,ID=88的对象名字就是o,而原来的ID=20这个对象在modify2方法中已不再有名字;可以理解为,modify2这个方法,只是和ID=20对象开了个玩笑,给他一个名字O,又剥削了这个名字。
不过,仅此而已,ID=20在modify2中,属性没有产生任何变化,所以,ID=20.value值还是15;
private void modify2(AClass o) {
//o = new AClass(20);
}也就是相当于在modify2(AClass o)可有可无,这里头的对象O跟外面modify2(AClass o) 这里红色的O的value根本没有关系,不管里边new了什么对象,新对象的value都不会被打印,对吧?
private void modify2(AClass o) {
o = new AClass(20);
}
在分解下我的理解 首先 private void modify2(AClass o) 这方法执行了(AClass o),已经打印出了15这个结果 ,后来o = new AClass(20); 这里只是给O重新指定了一个ID,对不对?