当前位置: 技术问答>java相关
又一个关于JAVA的问题,还是基本性质的题目,爱好者们进来研究研究
来源: 互联网 发布时间:2015-02-03
本文导语: 这次研究的话题是,到底函数对变量的影响是怎么回事 请先看这段程序: public class outer { public static void main(String a[]) { StringBuffer s=new StringBuffer("Java"); String c=new String("Java"); Hello(s,c); System.out.println(s+c)...
这次研究的话题是,到底函数对变量的影响是怎么回事
请先看这段程序:
public class outer
{
public static void main(String a[])
{
StringBuffer s=new StringBuffer("Java");
String c=new String("Java");
Hello(s,c);
System.out.println(s+c);
}
public static void Hello(StringBuffer s, String c)
{
StringBuffer temp=new StringBuffer("temp");
s.append("C");
s=temp;
c=c.replace('A','D');
c=new String("temp");
}
}
结果,你会发现是 JavaCJava
我觉得很奇怪啊,MOCK里面有很多关于这些的题目,我都一一实验了。
象那些很典型的
void swap(int i,intj) {
int temp;
temp=i;
i=j;
j=temp;
}
其实对原来的数是没有丝毫影响的,但是第一段代码中 StringBuffer的值却改变了?String却没有变;我原来以为StringBuffer就是例外,于是便重新赋值,结果后来的赋值就没有影响。
注意:如果把重新赋值移动到函数的第一行,再进行append,StringBuffer就又没有变化了。非常奇怪!
还有,就是如果传递进入函数的参数是 Stack ,又会出现非常奇怪的现象,我原代码没了,大家不妨去试试:初始化两个空的 Stack,在函数里 push ,返回值当然也是void ,可是在外面会有影响。如果在函数里交换,比如
Stack temp;
temp=i;
j=i;
那么往j里push,其实是往i里push;
感觉怪怪的。
希望有人告诉我为什么?
我很菜......
请先看这段程序:
public class outer
{
public static void main(String a[])
{
StringBuffer s=new StringBuffer("Java");
String c=new String("Java");
Hello(s,c);
System.out.println(s+c);
}
public static void Hello(StringBuffer s, String c)
{
StringBuffer temp=new StringBuffer("temp");
s.append("C");
s=temp;
c=c.replace('A','D');
c=new String("temp");
}
}
结果,你会发现是 JavaCJava
我觉得很奇怪啊,MOCK里面有很多关于这些的题目,我都一一实验了。
象那些很典型的
void swap(int i,intj) {
int temp;
temp=i;
i=j;
j=temp;
}
其实对原来的数是没有丝毫影响的,但是第一段代码中 StringBuffer的值却改变了?String却没有变;我原来以为StringBuffer就是例外,于是便重新赋值,结果后来的赋值就没有影响。
注意:如果把重新赋值移动到函数的第一行,再进行append,StringBuffer就又没有变化了。非常奇怪!
还有,就是如果传递进入函数的参数是 Stack ,又会出现非常奇怪的现象,我原代码没了,大家不妨去试试:初始化两个空的 Stack,在函数里 push ,返回值当然也是void ,可是在外面会有影响。如果在函数里交换,比如
Stack temp;
temp=i;
j=i;
那么往j里push,其实是往i里push;
感觉怪怪的。
希望有人告诉我为什么?
我很菜......
|
传参数时 类能被改变,但变量不行
类 StringBuffer ,Integer,Boolean,Vector,Double等
变量 int ,boolean, String,float ,double等
类 StringBuffer ,Integer,Boolean,Vector,Double等
变量 int ,boolean, String,float ,double等
|
请注意这里参数传过去时是传地址
S是在这个地址上作了append()所以改变了值
而对M中的S2的操作是赋值,这是就会使这个S不再指向原来的S,重新开了一个内存空间,值为JavaC 。但原来的S没有影响。
S是在这个地址上作了append()所以改变了值
而对M中的S2的操作是赋值,这是就会使这个S不再指向原来的S,重新开了一个内存空间,值为JavaC 。但原来的S没有影响。
|
public static void Hello(StringBuffer s, String c)
StringBuffer 参数是对象用的是“引用”(也就是是指针),所以他会变化。
而String c 是基本的数据类型,函数就copy了,不会改变数据的值。
StringBuffer 参数是对象用的是“引用”(也就是是指针),所以他会变化。
而String c 是基本的数据类型,函数就copy了,不会改变数据的值。
|
那是因为s.append("C")改变了s所引用的对象
而s=new StringBuffer("temp")只是让s指向了一个新对象,并不改变s原来引用的对象
而s=new StringBuffer("temp")只是让s指向了一个新对象,并不改变s原来引用的对象
|
s.append("C");
s=new StringBuffer("temp");
s = new StringBuffer("temp") 新建立了一个对象,改变了s的值(指向另外一个对象了)。但是对函数外面的对象却没有影响。
s=new StringBuffer("temp");
s = new StringBuffer("temp") 新建立了一个对象,改变了s的值(指向另外一个对象了)。但是对函数外面的对象却没有影响。