有两个例子,看了结果以后不大明白,请教一下各位大虾
public class Change {
public static void main(String args[])
{
StringBuffer a=new StringBuffer("ok");
System.out.println("Before change, a is " + a);
change(a);
System.out.println("After change a is " + a);
} public static void change(StringBuffer ia)
{
ia.append(" ok?");
}
}
运行结果是:
Before change, a is ok
After change a is ok ok?第二个例子:
public class TestRefer {
public static void main(String args[]){
Integer a;
a = new Integer(10);
System.out.println("Before Change, a is " + a);
change(a);
System.out.println("After Change a is "+a);
}
public static void change(Integer arg){
arg = new Integer(40);
}
}
运行结果是:
Before Change, a is 10
After Change a is 10 为什么第一个例子中对象会改变,而第二个例子中却没有改变
public class Change {
public static void main(String args[])
{
StringBuffer a=new StringBuffer("ok");
System.out.println("Before change, a is " + a);
change(a);
System.out.println("After change a is " + a);
} public static void change(StringBuffer ia)
{
ia.append(" ok?");
}
}
运行结果是:
Before change, a is ok
After change a is ok ok?第二个例子:
public class TestRefer {
public static void main(String args[]){
Integer a;
a = new Integer(10);
System.out.println("Before Change, a is " + a);
change(a);
System.out.println("After Change a is "+a);
}
public static void change(Integer arg){
arg = new Integer(40);
}
}
运行结果是:
Before Change, a is 10
After Change a is 10 为什么第一个例子中对象会改变,而第二个例子中却没有改变
理解了这点后,我们来看看你的例子,首先看看例一:在调用方法change时,把StringBuffer的对象a的引用作为值传递给change,运行ia.append(" ok?")后,改变了a地址的里面的内容,但是,a的引用是不变的,所以运行System.out.println("After change a is " + a)后,会把a地址的内容输出,当然就是After change a is ok ok?了
第二例子中,调用change时,把a的引用的值传递进去,change方法内重新创建了一个对象,(注意:该对象的创建不影响方法change外的变量,这可以通过变量的生命周期很容易理解),新的对象的值是40。但是方法体外的变量a的引用和值都没改变,所以输出的值都是10咯
---------------------
错误!!!!!!! Java里只有按值传递.如果学过C++, 把java中的引用, 当作C++中的指针去理解.
而C++中的引用则是另外一回事
所谓没有虚函数, 其实默认全部是虚函数
"change方法内重新创建了一个对象 ......"
但是语句 ‘arg = new Integer(40); ’ 不是把引用 arg 指向它了吗?
难道退出函数体后,arg又自动指向原先?
void main()
{
StringBuffer a("ok"); a.print(); //打印
change(&a);
a.print();//打印
} void change(StringBuffer* ia) //a的地址 复制给ia
{
ia->append(" ok?"); //ia-> 指向 a 对象 ,所以a.append("ok?") 改变了a的内容
}
第二个例子:void main()
Integer a(10);
printf("Before Change, a is ");
a.print();
change(a);
printf("Before Change, a is ");
a.print();
} void change(Integer* arg) // a 地址 复制给 arg (两者独立的)
{
arg = new Integer(40); // 又将 Integer(40) 的地址 复制给 arg ,因而 a 没变.
}
运行结果是:
Before Change, a is 10
After Change a is 10--学习中.