OK. 那么在上面那句话接着有两句话,你们看一下。 1.When a object instance is passed as an argument to an called method,the value of the argument is a reference to the object. 我的翻译是:当一个对象实例被作为一个参数传递倒一个调用的方法是,这个参数的值就是这个对象的引用。 2.The contents of the object can be changed in the called method,but the object reference is never changed. 我的翻译是:对象的内容可以被调用的方法改变,但是对象的引用不能。照刚才那句“java只按值来传递参数”,也就是说,参数代表的是数值。而第一句的意思却说,这个参数的值是这个对象的引用。不是矛盾了码?
首先,说明一下在JAVA中有:按值传递和按引用传递。 下面是我对这两句话的理解,供大家参考。 //1。当一个对象作为一个参数传递倒一个调用的方法时,这时是按引用传递,传递的是该对象的首地址。 //2。这时对象的内容可以被它所调用的方法改变,而对象的引用是不变的。 下面是一个按引用传递的例子: public class AboutPass { public static void main(String[] args) { StringBuffer sa1= new StringBuffer("java"); StringBuffer sa2=new StringBuffer("javac"); m(sa1,sa2); System.out.println(sa1\n+sa2);} public void m(StringBffer a1,StringBuffer a2) { a1.append(a2); a1=a2;} } out: javajavac javac
"the object reference is never changed. ",是不是这个意思,在方法体中传给方法的句柄不能被改变(指向别处)。
To ourjava(激情男孩) 你的历程编译有error,AboutPass.java:7: 在静态上下文中不能引用非静态方法 m(java.lang.StringBuffer,java .lang.StringBuffer) m(sa1,sa2);情解释
激情男孩,我好象在哪本书上看到Java只能pass by value啊。 不知道我是不是记错了,那你看看下面这个程序:public class SL275 { public static void changeInt(int val) { val = 55; } public static void main(String args[]) { int val; val = 11; changeInt(val); System.out.println("Int value is: " + val); } 知道结果是什么吗? 是11啊 怎么解释啊 那就算有pass by value和pass by reference两种,那怎么判断啊?
那么在上面那句话接着有两句话,你们看一下。
1.When a object instance is passed as an argument to an called method,the value of the argument is a reference to the object.
我的翻译是:当一个对象实例被作为一个参数传递倒一个调用的方法是,这个参数的值就是这个对象的引用。
2.The contents of the object can be changed in the called method,but the object reference is never changed.
我的翻译是:对象的内容可以被调用的方法改变,但是对象的引用不能。照刚才那句“java只按值来传递参数”,也就是说,参数代表的是数值。而第一句的意思却说,这个参数的值是这个对象的引用。不是矛盾了码?
下面是我对这两句话的理解,供大家参考。
//1。当一个对象作为一个参数传递倒一个调用的方法时,这时是按引用传递,传递的是该对象的首地址。
//2。这时对象的内容可以被它所调用的方法改变,而对象的引用是不变的。
下面是一个按引用传递的例子:
public class AboutPass
{
public static void main(String[] args)
{
StringBuffer sa1= new StringBuffer("java");
StringBuffer sa2=new StringBuffer("javac");
m(sa1,sa2);
System.out.println(sa1\n+sa2);}
public void m(StringBffer a1,StringBuffer a2)
{
a1.append(a2);
a1=a2;}
}
out: javajavac
javac
",是不是这个意思,在方法体中传给方法的句柄不能被改变(指向别处)。
.lang.StringBuffer)
m(sa1,sa2);情解释
不知道我是不是记错了,那你看看下面这个程序:public class SL275
{
public static void changeInt(int val)
{
val = 55;
} public static void main(String args[])
{
int val;
val = 11;
changeInt(val);
System.out.println("Int value is: " + val);
}
知道结果是什么吗?
是11啊
怎么解释啊
那就算有pass by value和pass by reference两种,那怎么判断啊?
我觉得是不是说的是基本类型的时候采用的值传递呀!
在对象的时候采用传递句柄
我是这么理解的:
在内存中你的程序中定义的两个val是完全两回事,也就是说内存中有两个val: changeInt中的val和main的val.
而在JAVA中程序的执行是从MAIN开始的,发现MAIN中有完整的VAL,它就不会再到其它地方去找VAL了,相当于你定义的changInt方法是无效的。
jin2001() :
谢谢,你为我指出了BUG。
上面这个程序是我临时做的没有多想,在JAVA中静态类是不能使用非静态方法的。
public class AboutPass
{
public static void main(String[] args)
{
StringBuffer sa1= new StringBuffer("java");
StringBuffer sa2=new StringBuffer("javac");
m(sa1,sa2);
System.out.println(sa1+"\n"+sa2);
}
public static void m(StringBffer a1,StringBuffer a2)
{
a1.append(a2);
a1=a2;
}
}
out: javajavac
javac