public static void fund(int a,String b,String c){
a=a+1;
b.trim();
c=b;
} int a=0;
String b="Hello World ";
String c="OK";
fund(a,b,c);
System.out.println(a+","+b+","+c);最后调用输出结果为0,Hello World ,OK,为什么后面是OK呢,而不是Hello World
a=a+1;
b.trim();
c=b;
} int a=0;
String b="Hello World ";
String c="OK";
fund(a,b,c);
System.out.println(a+","+b+","+c);最后调用输出结果为0,Hello World ,OK,为什么后面是OK呢,而不是Hello World
http://topic.csdn.net/u/20090523/21/c6c9028b-04de-4aef-8b9e-f63e8eb29864.html
1.普通类型的实际的值
2.对象类型的引用。引用也是一种值。
对于基本类型,复制基本类型。
对于引用,复制引用。
被标题吸引进来了。
------------------
java中的八大基本类型作为方法参数是值传递,传进来的是3、HelloWord、OK
Object引用类型同样也是值传递,传进来的是这个Object实例的引用地址,方法内根据这个地址来操作目标数据。(这点看上去确实像所谓的引用传递,呵呵,但其实不是)
我想下面个例子能解释下
java public static void main(String[] argus){
String str1="a";
String str2="b";
change(str1,str2);
System.out.println("str1:" + str1);
System.out.println("str2:" + str2);
} private static void change(String str1, String str2){
String temp = str1;
str1=str2;
str2=temp;
}
调用fund(a,b,c)的时候只是将引用c做了一个拷贝。
c=b;将被拷贝的引用赋值为引用b,原来的实参不变。注:Java的引用与C++的引用不同(不要受其影响),它与C++的指针很类似。
首先,楼主要明确一个概念:JAVA只有值传递,没有引用传递!
分两种情况:
1:如果参数是基本数据类型的话,函数内部对参数做修改,不会影响外部原参数。
因为基本数据类型在传入函数时,java会做个copy动作,所以在内部修改此参数,只是修改的copy副本
2:如果参数是对象类型的话,函数内部对对象的域做的修改,会改变外部原对象的域。
因为参数是对象,java会copy此对象的句柄地址为一个新的副本,对此副本指向的对象做域的更改,自然会更改到原对象。根据以上两种情况,java都会做个copy副本的动作,所以是“值传递”不知道我解释的明白吗?
”
在一个就是 fund(a,b,c);只是一个方法函数,不会对abc的值做出改变,不会影响,因为fund(a,b,c);返回类型是void 来填充的。看看书吧
fund地址-->函数地址
a--->普通值复制。
b--->一看不可通过引用修改就编译为b的引用副本
c--->一看不可通过引用修改就编译为c的引用副本
你修改的是栈内指针。
其实引用就是指针
你的 c = b ; 是把c的副本指向的地址给改变了
但并没有改变参数c的值即地址;
a=a+1;
b.trim();
c.str="BBBBBBBBBBB";
}
public class Test{
String str = "AAAAAA";
}琢磨琢磨这个吧 希望能明白
假设:
我和lz都是会分身术的神人,我的职业是吸毒,而lz则是贩毒。根据规定我俩只能在一间屋内进行交易,而自身不能亲自去交易,彼此就只能各分出一个小我来参与交易,[b]而小我只能在屋内存在[/b]。
我犯毒瘾了,找lz买毒。根据规定,双方都只能拿着现金或毒品在屋外等待,让彼此的小我去交易,同时,装着现金的保险箱上有两条绳子,一条连着我,而另一条则连着小我,lz也如此。
在屋内,我和lz的小我正在紧锣密鼓的交易,双方的小我把彼此绳头交换,这样在屋内看似彼此已经完成交易,我和lz在外面窃喜,殊不知,正当得意之时,彼此的小我连同绳子却一起消失,我和lz的愿望也就落空了
巩固一下:张孝祥老师的例子:
public class PassRef
{
int x;
public static void main(String[] args)
{
PassRef obj=new PassRef();
obj.x=5;
change(obj);
System.out.println(obj.x);
}
public static void change(PassRef obj)
{
obj.x=3;
}
}
这次小我们比较聪明,交易成功了!
不知这样解释妥当不
fund(a,b,c){}和 String c="OK";中都有c变量,我们都知道字符串是引用类型,
fund(a,b,c){}中的c和String c="OK";相当于是两个指针变量,但都是指向同一地址,fund(a,b,c){}中的c=b当然不会改变String c="OK";中定义的c的值,所以打印的结果为ok我倒觉得打印出的变量b的值有些出乎我的意料,但看了看String类中trim()方法的代码实现,就知道原因是什么了。
public static void change(String a) {
a = "aa";
}
public static void changeBuffer(StringBuffer a) {
a.append("a");
}
public static void main(String[] args) {
String b = "b";
change(b);
StringBuffer c = new StringBuffer("c");
changeBuffer(c);
System.out.print(c);
}
}
System.out.print(b);结合String的常量特性;容易理解的
public static void fund(int a,String b,String c){
a=a+1;//5
b.trim();//6
c=b;//7
}
public static void main(String[] args){
int a=0;//1
String b="Hello World ";//2
String c="OK";//3
fund(a,b,c);//4
System.out.println(a+","+b+","+c);//8
}
} 内存的执行过程分析:
1,程序从main函数进入,在栈空间(Stack)分配一块区域给变量a=0;
2,在常量池(或称数据段)分配一块内存区域存放"Hello Word"同时将它的引用赋值给b,b在栈空间分配,即栈空间的b指向了数据段中的"Hello Word" ;
3,第三句的执行过程和第二句同理;
4,到第四句调用函数fund()时转到函数体中,主意很关键的地方就是传进去的参数在内存中的分配,此时的a是临时在栈空间的又一次分配,它与main函数中的a是不一样的;b和c也是临时在栈中分配,指向常量池中的"Hello Word";可以理解为在调用fund执行的过程中栈中有两个a=0,一个为main的,另一个为fund的,当fund执行完后为其分配的变量就消失了,同理b和c也一样。所以fund执行完后对main中的变量在此是没有影响的;
5...;
6...;
7...;
8最后打印出:0,Hello World ,OK;接着main函数结束,为其分配的变量消失,整个程序执行完毕。
补充:考虑以下情况,在main函数中new一个对象,并将这个对象的引用传给一个函数func(),在func()中对对象的属性进行修改,那么当在main中调用func()时会改变对象的属性,但是在main中该对象的引用是不会变的,道理是一样的。
希望能给楼主释疑......
同意#38的说法~~
a=a+1;
b.trim();
c=b;
}在java中,基本类型传递的是值,所以这里修改了a并不会影响了外部的a的值而b.trim()并不会影响b的值,这个方法是返回一个新的对象的(如果不用处理就直接返回自身)
而c = b是使得c指向了一个新的对象,并不是修改原来c对象的值,所以外部对象的值不会受到影响
所以fund 函数中的 c 和 main 中传的实参c的地址是不一样的;
a1=a1+1;
b1.trim();
c1=b1;
}这样好理解点
这个是java中的争议问题,也是说sun设计java上缺陷:
在比如Integer中在0—127之间是相等的,boolean类型在实际中并不是一位的,可能是2个字节、4个字节
main中的c,与fund中的c在作了c=b,指到的是另一个对象,(1)(2)指的对象不一样,而main c对象与(1)处是一样的
main c->OK
fund(){
c->OK...........(1)
String e=c;
c=b;
c->Hello World.............(2)
测试
e==c ? 就明白了
}
a=a+1;
b.trim(); String 是不变字符串 任何对他的操作都将生成一个新的对象 方法的返回值就是
string trim();
c=b; //C 本来指向 "OK“ 在这里C指向了 C=“Hello World ”
但是外面的C引用还是指向 =“OK” ,传递的是对象的引用,
} int a=0;
String b="Hello World ";
String c="OK";
fund(a,b,c);
System.out.println(a+","+b+","+c);