论坛首页 Java企业应用论坛

Java容易搞错的知识点-觉得基础扎实的来看

浏览 61888 次
该帖已经被评为良好帖
作者 正文
   发表时间:2011-03-07  
msnvip 写道
forsecond 写道
/**
* @author 子弹哥
*
*/
public class TestRef {

public static void main(String[] args) {
Aa a1 = new Aa(1);
Aa a2 = new Aa(2);
append(a1, a2);
System.out.println(a1.getA() + "," + a2.getA());
a2 = a1;
System.out.println(a1.getA() + "," + a2.getA());
}

public static void append(Aa a1, Aa a2) {
a1.setA(a2.getA());
a2 = a1;
}

}

class Aa {
private int a;

public Aa(int a) {
this.a = a;
}

public int getA() {
return a;
}

public void setA(int a) {
this.a = a;
}

}

感觉还是有点问题,如果append方法中的b=a;操作只是改变了append方法的中b的指向,并没有改变main方法中b的指向。那么上面我改的这个例子,好像不是这么回事


看你的这句.这样改成a1为2了.输出应该是全2
a1.setA(a2.getA());



我奇怪的就是在
public static void append(Aa a1, Aa a2) {
a1.setA(a2.getA());
a2 = a1;
}
这当中a1 a2跟第七里面的StringBuffer难道不是一样的吗》?传递过来的都是对象的引用地址啊。既然StringBuffer在方法里面只是把局部变量b的指向修改了,而main没变,那我改的这个方法里面,有什么不同吗?
0 请登录后投票
   发表时间:2011-03-07  
forsecond 写道
msnvip 写道
forsecond 写道
/**
* @author 子弹哥
*
*/
public class TestRef {

public static void main(String[] args) {
Aa a1 = new Aa(1);
Aa a2 = new Aa(2);
append(a1, a2);
System.out.println(a1.getA() + "," + a2.getA());
a2 = a1;
System.out.println(a1.getA() + "," + a2.getA());
}

public static void append(Aa a1, Aa a2) {
a1.setA(a2.getA());
a2 = a1;
}

}

class Aa {
private int a;

public Aa(int a) {
this.a = a;
}

public int getA() {
return a;
}

public void setA(int a) {
this.a = a;
}

}

感觉还是有点问题,如果append方法中的b=a;操作只是改变了append方法的中b的指向,并没有改变main方法中b的指向。那么上面我改的这个例子,好像不是这么回事


看你的这句.这样改成a1为2了.输出应该是全2
a1.setA(a2.getA());



我奇怪的就是在
public static void append(Aa a1, Aa a2) {
a1.setA(a2.getA());
a2 = a1;
}
这当中a1 a2跟第七里面的StringBuffer难道不是一样的吗》?传递过来的都是对象的引用地址啊。既然StringBuffer在方法里面只是把局部变量b的指向修改了,而main没变,那我改的这个方法里面,有什么不同吗?


..和lz的题一样的好不。
public static void append(Aa a1, Aa a2) {
a1.setA(a2.getA());
a2 = a1;
}
这个方法 a1里a的值被改了,a2里a的值没改。。 主要你这样做有点区分不开 值都改成2了。。
a2 = a1;这句其实只是改变的副本。
0 请登录后投票
   发表时间:2011-03-07  
forsecond 写道
msnvip 写道
forsecond 写道
/**
* @author 子弹哥
*
*/
public class TestRef {

public static void main(String[] args) {
Aa a1 = new Aa(1);
Aa a2 = new Aa(2);
append(a1, a2);
System.out.println(a1.getA() + "," + a2.getA());
a2 = a1;
System.out.println(a1.getA() + "," + a2.getA());
}

public static void append(Aa a1, Aa a2) {
a1.setA(a2.getA());
a2 = a1;
}

}

class Aa {
private int a;

public Aa(int a) {
this.a = a;
}

public int getA() {
return a;
}

public void setA(int a) {
this.a = a;
}

}

感觉还是有点问题,如果append方法中的b=a;操作只是改变了append方法的中b的指向,并没有改变main方法中b的指向。那么上面我改的这个例子,好像不是这么回事


看你的这句.这样改成a1为2了.输出应该是全2
a1.setA(a2.getA());



我奇怪的就是在
public static void append(Aa a1, Aa a2) {
a1.setA(a2.getA());
a2 = a1;
}
这当中a1 a2跟第七里面的StringBuffer难道不是一样的吗》?传递过来的都是对象的引用地址啊。既然StringBuffer在方法里面只是把局部变量b的指向修改了,而main没变,那我改的这个方法里面,有什么不同吗?


你自己画个图演示下不就知道了,你只是被最后出来的2,2 2,2的结果给弄糊涂了,你把你的append方法中的a1.setA(a2.getA());注释掉你再看看,你就明白了
0 请登录后投票
   发表时间:2011-03-07  
forsecond 写道
msnvip 写道
forsecond 写道
/**
* @author 子弹哥
*
*/
public class TestRef {

public static void main(String[] args) {
Aa a1 = new Aa(1);
Aa a2 = new Aa(2);
append(a1, a2);
System.out.println(a1.getA() + "," + a2.getA());
a2 = a1;
System.out.println(a1.getA() + "," + a2.getA());
}

public static void append(Aa a1, Aa a2) {
a1.setA(a2.getA());
a2 = a1;
}

}

class Aa {
private int a;

public Aa(int a) {
this.a = a;
}

public int getA() {
return a;
}

public void setA(int a) {
this.a = a;
}

}

感觉还是有点问题,如果append方法中的b=a;操作只是改变了append方法的中b的指向,并没有改变main方法中b的指向。那么上面我改的这个例子,好像不是这么回事


看你的这句.这样改成a1为2了.输出应该是全2
a1.setA(a2.getA());



我奇怪的就是在
public static void append(Aa a1, Aa a2) {
a1.setA(a2.getA());
a2 = a1;
}
这当中a1 a2跟第七里面的StringBuffer难道不是一样的吗》?传递过来的都是对象的引用地址啊。既然StringBuffer在方法里面只是把局部变量b的指向修改了,而main没变,那我改的这个方法里面,有什么不同吗?

public static void append(Aa a1, Aa a2) {
a1.setA(a2.getA());
a2 = a1;
}
改成
public static void append(Aa a1, Aa a2) {
a1.setA(a1.getA()+a2.getA());
a2 = a1;
}
你就明白了。
0 请登录后投票
   发表时间:2011-03-07  
append  方法和SET 能一样?
0 请登录后投票
   发表时间:2011-03-07  
zhoupuyue 写道
forsecond 写道
msnvip 写道
forsecond 写道
/**
* @author 子弹哥
*
*/
public class TestRef {

public static void main(String[] args) {
Aa a1 = new Aa(1);
Aa a2 = new Aa(2);
append(a1, a2);
System.out.println(a1.getA() + "," + a2.getA());
a2 = a1;
System.out.println(a1.getA() + "," + a2.getA());
}

public static void append(Aa a1, Aa a2) {
a1.setA(a2.getA());
a2 = a1;
}

}

class Aa {
private int a;

public Aa(int a) {
this.a = a;
}

public int getA() {
return a;
}

public void setA(int a) {
this.a = a;
}

}

感觉还是有点问题,如果append方法中的b=a;操作只是改变了append方法的中b的指向,并没有改变main方法中b的指向。那么上面我改的这个例子,好像不是这么回事


看你的这句.这样改成a1为2了.输出应该是全2
a1.setA(a2.getA());



我奇怪的就是在
public static void append(Aa a1, Aa a2) {
a1.setA(a2.getA());
a2 = a1;
}
这当中a1 a2跟第七里面的StringBuffer难道不是一样的吗》?传递过来的都是对象的引用地址啊。既然StringBuffer在方法里面只是把局部变量b的指向修改了,而main没变,那我改的这个方法里面,有什么不同吗?

public static void append(Aa a1, Aa a2) {
a1.setA(a2.getA());
a2 = a1;
}
改成
public static void append(Aa a1, Aa a2) {
a1.setA(a1.getA()+a2.getA());
a2 = a1;
}
你就明白了。
不好意思,例子是对的,关键是我取的1 2。。。。谢谢
0 请登录后投票
   发表时间:2011-03-07  
onlylau 写道
forsecond 写道
msnvip 写道
forsecond 写道
/**
* @author 子弹哥
*
*/
public class TestRef {

public static void main(String[] args) {
Aa a1 = new Aa(1);
Aa a2 = new Aa(2);
append(a1, a2);
System.out.println(a1.getA() + "," + a2.getA());
a2 = a1;
System.out.println(a1.getA() + "," + a2.getA());
}

public static void append(Aa a1, Aa a2) {
a1.setA(a2.getA());
a2 = a1;
}

}

class Aa {
private int a;

public Aa(int a) {
this.a = a;
}

public int getA() {
return a;
}

public void setA(int a) {
this.a = a;
}

}

感觉还是有点问题,如果append方法中的b=a;操作只是改变了append方法的中b的指向,并没有改变main方法中b的指向。那么上面我改的这个例子,好像不是这么回事


看你的这句.这样改成a1为2了.输出应该是全2
a1.setA(a2.getA());



我奇怪的就是在
public static void append(Aa a1, Aa a2) {
a1.setA(a2.getA());
a2 = a1;
}
这当中a1 a2跟第七里面的StringBuffer难道不是一样的吗》?传递过来的都是对象的引用地址啊。既然StringBuffer在方法里面只是把局部变量b的指向修改了,而main没变,那我改的这个方法里面,有什么不同吗?


你自己画个图演示下不就知道了,你只是被最后出来的2,2 2,2的结果给弄糊涂了,你把你的append方法中的a1.setA(a2.getA());注释掉你再看看,你就明白了

谢谢哈。
0 请登录后投票
   发表时间:2011-03-07  
akunamotata 写道
引用
4.那么(a == (x + y))为什么是false呢?这点暂点有点不大清楚。初步认为是x+y是引用相加,不能放入常量池。


求解



执行x+y时,JVM首先会在堆中创建一个StringBuilder类,同时用x指向的拘留字符串对象完成初始化,然后调用append方法完成对y所指向的拘留字符串的合并操作,接着调用StringBuilder的toString()方法在堆中创建一个String对象,最后将刚生成的String对象的堆地址存放在x+y中。而局部变量a存储的是常量池中"abcd"所对应的拘留字符串对象的地址,所以a和x+y的地址不一样
0 请登录后投票
   发表时间:2011-03-07  
li463968565 写道
append  方法和SET 能一样?


在这个题里造成效果都一样。都是改变了内存里的值。
传递的参数虽然时副本,但是指向的值是同一个。
0 请登录后投票
   发表时间:2011-03-07  
freish 写道
新手贴?

《java解惑》上都有的东西啊。。。。

这个书,还是得看

我只能说书上有的东西,并不是你的东西。你看过那本书也不能说明任何问题。只有转化到自已的大脑才是最好的。
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics