public class Test {
public static void main(String[] args)
{
String a=new String("A");
String b=new String("B");
fun(a,b);
System.out.println(a+","+b);
}
public static void fun(String x,String y)
{
x+=y;
y=x;
}
}这个程序的结果为什么是: A,B ,为什么不是:AB,AB呢?
String产生的不是对象吗? fun(a,b)传递的不是a,b的引用吗?
public static void main(String[] args)
{
String a=new String("A");
String b=new String("B");
fun(a,b);
System.out.println(a+","+b);
}
public static void fun(String x,String y)
{
x+=y;
y=x;
}
}这个程序的结果为什么是: A,B ,为什么不是:AB,AB呢?
String产生的不是对象吗? fun(a,b)传递的不是a,b的引用吗?
解决方案 »
- 2013传智播客java面试葵花宝典 ,内部人员花了1W提供的,千万别错过,仅此一次机会。
- java ftp 访问总是走不下去,怎么回事哦?
- 使用JList显示jpcap.loopPacket()结果时的问题
- 关于jsp回压字符流的问题~
- JAVA调用MySQL存储过程跟SQL2000一样吗?(高手们帮帮忙吧.跪求了,急用)
- 一个集合问题,纳闷。给100,并跪求答案。
- 字符替换的问题。
- 为什么最大float数是0x7f800000 ???
- 怎么指定使用哪个数据库?<set-property property="url" value="jdbc:microsoft:sqlserver://127.0.0.1:1433"/>
- 对短消息编程感兴趣吗,请看hnjsbyl.nease.net
- 请教:关于多态的一道题目
- 菜鸟求助
public static void main(String[] args) {
String a=new String("A");
String b=new String("B");
fun(a,b);
System.out.println(a+","+b);
System.out.println(a.concat(b));
}
public static void fun(String x,String y) {
x+=y;
y=x;
}
}
问题出在 x+=y;
String对于+操作,是生成新的String对象,而不改变原来的对象。
String b=new String("B"); String类型a,b的空间重新new了一个新的值A,B
基本数据类型都是存放在栈里面的,比如char,byte,short,int,long,float,double,boolean,
int i=1;i和1都是存储在栈里面的
复杂数据类型,比如自定义对象,String a=new String("A"); o这个引用变量(或者叫指针)是存放在栈里面的,我们new的空间(或者说这个对象的数据内存块)是存放在堆里面,o所代表的值就是堆里面内存块的首地址
public class Test {
public static void main(String[] args)
{
String a=new String("A");
String b=new String("B");
fun(a,b); //=============只是一个引用传递,你可以这样理解把b、b的值赋给了参数x、y
System.out.println(a+","+b); //fun方法中做任何事都不会改变 a 、b的值(指目前代码)
}
public static void fun(String x,String y) //===方法中只是做了x、y的值的改变
{
x+=y;
y=x;
System.out.println(x+","+y);//=====你要是在这加上这个那就会出现AB,AB
}
}
只不过String是final的,其内容无法改变,每次赋值都会在内存中重新分配一块区域来存储新的内容public static void main(String[] args)
{
String str = "A";
fun(str);
}public staitc void fun(String s)
{
s = "B";
}
用上面这个例子来说明,str是一个引用,引用的对象是“A”, 当调用fun(str)时,fun的形参s一开始也将引用"A",但是当执行s = "B"时,虚拟机将在内存中重新分配一块儿内存来存储"B",并让s引用"B",而str仍然引用的是“A”
简而言之,这里的s = "B",基本上可以认为是s = new String("B"),如果是这样写的话,就能够理解str为啥没有改变了。当然事实上还是会有差别的,这就要牵扯到String类型的常量池的问题,就不多说了
public class pass {
public static void main(String[] args) {
String a=new String("A");
String b=new String("B"); System.out.println(a.concat(b));
}
}
输出结果:AB你原来的代码也可以这样写(可能比较烂,但能实现楼主愿望)
public class Test {
public static void main(String[] args) {
String a=new String("A");
String b=new String("B");
fun(a,b);
//System.out.println(a+","+b); 这里输出的是a,b的最初值
}
public static void fun(String x,String y) { //这个方法没有改变a,b的值,而是X,Y
x += y;
y = x;
System.out.println(x + "," + y);
}
}
输出结果: AB,AB
上个世纪90年代末,大学首开c/c++,所以理解上面都是带c/c++的思想,还流传下来了,甚至出的书上也这么写,但结果是没错
值的拷贝,但它的值就是一个地址,就这么回事
只是String类型的值是不可变的
public static int x = 1;
public static void main(String[] args){
add(x);
System.out.println(x);
}
public static void add(int a){
a++;
}
}楼主你认为输出的是什么?很明显是1,不是2吧