作者:臧圩人(zangweiren)
网址:http://zangweiren.javaeye.com >>>转载请注明出处! < < < JAVA中的传递都是值传递吗?有没有引用传递呢? 在回答这两个问题前,让我们首先来看一段代码:
Java代码
public final class ParamTest {
// 初始值为0
protected int num = 0;
// 为方法参数重新赋值
public void change(int i) {
i = 5;
}
// 为方法参数重新赋值
public void change(ParamTest t) {
ParamTest tmp = new ParamTest();
tmp.num = 9;
t = tmp;
}
// 改变方法参数的值
public void add(int i) {
i += 10;
}
// 改变方法参数属性的值
public void add(ParamTest pt) {
pt.num += 20;
}
public static void main(String[] args) {
ParamTest t = new ParamTest();
// 为基本类型参数重新赋值
t.change(t.num);
System.out.println(t.num);
// 为引用型参数重新赋值
t.change(t);
System.out.println(t.num);
// 改变基本类型参数的值
t.add(t.num);
System.out.println(t.num);
// 改变引用类型参数所指向对象的属性值
t.add(t);
System.out.println(t.num);
}
} 这段代码的运行结果如下: 0
0
0
20
为什么结果不是
0
9
0
29
红色那里 public void change(ParamTest t) 这个不是引用类型做参数啊
不是要改t的属性了嘛?
为什么得出来不是9而是0?
网址:http://zangweiren.javaeye.com >>>转载请注明出处! < < < JAVA中的传递都是值传递吗?有没有引用传递呢? 在回答这两个问题前,让我们首先来看一段代码:
Java代码
public final class ParamTest {
// 初始值为0
protected int num = 0;
// 为方法参数重新赋值
public void change(int i) {
i = 5;
}
// 为方法参数重新赋值
public void change(ParamTest t) {
ParamTest tmp = new ParamTest();
tmp.num = 9;
t = tmp;
}
// 改变方法参数的值
public void add(int i) {
i += 10;
}
// 改变方法参数属性的值
public void add(ParamTest pt) {
pt.num += 20;
}
public static void main(String[] args) {
ParamTest t = new ParamTest();
// 为基本类型参数重新赋值
t.change(t.num);
System.out.println(t.num);
// 为引用型参数重新赋值
t.change(t);
System.out.println(t.num);
// 改变基本类型参数的值
t.add(t.num);
System.out.println(t.num);
// 改变引用类型参数所指向对象的属性值
t.add(t);
System.out.println(t.num);
}
} 这段代码的运行结果如下: 0
0
0
20
为什么结果不是
0
9
0
29
红色那里 public void change(ParamTest t) 这个不是引用类型做参数啊
不是要改t的属性了嘛?
为什么得出来不是9而是0?
解决方案 »
- 我是一个学生,目前只学习了C,C++,java,我想设计一个软件参加比赛,现在还没有一点想法,求高人指点
- SpinnerDateModel中的calendarField属性有什么用?
- 一个jframe 中,有一个按钮,每点一下,窗口都会变大一点请问怎么做啊
- JCreator不太会用……
- 请教关于SWT Browser的问题
- 怎么制作一个类似向导的东西?
- 有这样的开源软件吗?
- 散50分,请教:如何将(4*(100+0.8)-1)表达式储存为数组?
- 使用RMI时抛出 error during JRMP connection establishment; nested exception is:java.io.EOFException]
- jbuilder注册问题!!!!!!
- 计算1000!后有几个零?
- javaGUI字体讨论
不是要改t的属性了嘛?
为什么得出来不是9而是0? 是引用传递,将 实参t 传给 形参t,则 形参t 与 实参t 指向同一个对象;
方法里改变了 形参t的指向为tmp但 实参t 的指向并未变;
只有当你改变 形参t 的属性时,改变才会保留(这时2个t指向同一个对象,实际改变的是这个对象的属性)
ParamTest tmp = new ParamTest();
tmp.num = 9;
t = tmp;
} public void add(ParamTest pt) {
pt.num += 20;
}
其实上面2段代码正好解释这点,第一段是改变了形参t的指向(引用),它与传入的实参t的指向就不同了,因此改边不做保留;
第二段是改变了属性,而指向未变,因此对形参t的改变即是对实参t的改变;
一定要明白引用类型的含义;