看以下代码,先别运行,预测一下输出结果。
public class ClassMain {
public static void main(String args[]) {
/********第一段*******************/
ClassE a = new ClassE();
ClassE b = new ClassE();
a.i=1;
b.i=2;
b=a;
b.i=3;
System.out.println(a.i);
/********第二段*******************/
ClassE c = new ClassE();
ClassMain cm = new ClassMain();
c.i=1;
cm.revalue(c);
System.out.println(c.i);
String s1 = new String();
String s2 = new String();
/********第三段*******************/
s1="a";
s2="b";
s1=s2;
s2="c";
System.out.println(s1);
}
public void revalue(ClassE c) {
ClassE d = new ClassE();
d.i=2;
c=d;
d.i=3;
}
}
class ClassE {
int i=0;
}
public class ClassMain {
public static void main(String args[]) {
/********第一段*******************/
ClassE a = new ClassE();
ClassE b = new ClassE();
a.i=1;
b.i=2;
b=a;
b.i=3;
System.out.println(a.i);
/********第二段*******************/
ClassE c = new ClassE();
ClassMain cm = new ClassMain();
c.i=1;
cm.revalue(c);
System.out.println(c.i);
String s1 = new String();
String s2 = new String();
/********第三段*******************/
s1="a";
s2="b";
s1=s2;
s2="c";
System.out.println(s1);
}
public void revalue(ClassE c) {
ClassE d = new ClassE();
d.i=2;
c=d;
d.i=3;
}
}
class ClassE {
int i=0;
}
楼主【jiashengfan】截止到2008-07-16 15:18:27的历史汇总数据(不包括此帖):
发帖的总数量:2 发帖的总分数:120 每贴平均分数:60
回帖的总数量:10 得分贴总数量:2 回帖的得分率:20%
结贴的总数量:2 结贴的总分数:120
无满意结贴数:0 无满意结贴分:0
未结的帖子数:0 未结的总分数:0
结贴的百分比:100.00% 结分的百分比:100.00%
无满意结贴率:0.00 % 无满意结分率:0.00 %
敬礼!
1
b别的都容易,就是这句
public void revalue(ClassE c) {
ClassE d = new ClassE();
d.i=2;
c=d;
d.i=3;
}
只要知道java中的参数传递都是pass by value;就可以了
里面c=d;对外面的参数c引用的对象不存在影响.
第一个考查的是对象,与变量的问题,
第二个表示的是,参数传的是值,还是地址的问题
第三个String是一个类所以每一个字符串就是一个对象实例.
ClassE a = new ClassE();
ClassE b = new ClassE(); //创建两个对象a.i=1;
b.i=2; //两个对象有不同的值
b=a; //让b(b只是一个引用变量,它可以引用任何同类型的对象)也引用a所引用的对象,以后用b或者a都操作同一对象
b.i=3; //这里实际也就是改变了a所指向的对象,因为a,b都是引用了同一对象System.out.println(a.i); //这里当然是3了
/********第三段*******************/
String s1 = new String();
String s2 = new String(); //s1,s2都只是引用变量
s1="a"; //s1被改成引用"a"这个对象,它不引用原来的对象了
s2="b"; //s2被改成引用"b"这个对象,它不引用原来的对象了
s1=s2; //让s1引用s2所引用的对象,也就是s1这时候也引用"b"这个对对象
s2="c"; //s2被改成引用"c"这个对象,但它没有改变s1的引用.
System.out.println(s1); //由上面可知:s1这时候是引用"b"这个对象的}
看了你说的恍然大悟 呼呼。谢谢刚研究java.
(敢向我扔砖头的朋友先运行试试看!PS:我发誓没运行过)
我设了断点,测试到revalue()调用结尾,c.i还是3,而且CLASSE c传递的应该是引用,按理说调用完了revalue()之后c.i会跟着改变的,但是还是便会1,你懂的话麻烦告诉我为什么...
1
b 别的都容易,就是这句
public void revalue(ClassE c) {
ClassE d = new ClassE();
d.i=2;
c=d;
d.i=3;
}
只要知道java中的参数传递都是pass by value;就可以了
里面c=d;对外面的参数c引用的对象不存在影响.
在方法里传入的实际上是d这个引用的地址
然后在方法内部又生成了一个d指向这个地址 方法里的d与传入之前的d指向同一地址
然后
E e = new 了一个E();
e.i=3;
d = e;//这时仅仅是方法内部的d指向了 新分配的地址
d.i的值就是3
然后方法结束 方法内部的e 和 d 被当作垃圾回收外部的引用d不受影响如果这么理解不对的话希望大侠们帮帮偶
1
b 1.a指向了b引用的对象
2.方法revalue中的参数ClassE c只是传入参数的引用地址拷贝。至于在方法内部有c=d,这个c跟方法外部调用的c是两码事
3.s1指向了s2引用的对象
s1还引用"a"吗?
我要打印出"a"拿哪个啊,现在是不是没有指向"a"的变量了?
/********第三段*******************/
s1="a";
s2="b";
s1=s2;
s2="c";
System.out.println(s1); } public void revalue(ClassE c) {
ClassE d = new ClassE();
d.i=2;
c.i=4;//在c的地址被赋值给d之前
c=d;
d.i=3;
}
输出的结果是4而不是1
String s1 = new String();
String s2 = new String(); //s1,s2都只是引用变量
s1="a"; //s1被改成引用"a"这个对象,它不引用原来的对象了
s2="b"; //s2被改成引用"b"这个对象,它不引用原来的对象了
s1=s2; //让s1引用s2所引用的对象,也就是s1这时候也引用"b"这个对对象
s2="c"; //s2被改成引用"c"这个对象,但它没有改变s1的引用.
System.out.println(s1); //由上面可知:s1这时候是引用"b"这个对象的 } 为什么之前第一段那是同时引用了一个对象..而这里也是...为什么上面那个引用的对象改了..就一起改..这里就只改了一个的~?
第二阶段1
第三阶段bClassE.javapublic class ClassE {
public int i;
}
TestClassE.javapackage net.pinkcoco.junit;
import net.pinkcoco.ClassE;import org.apache.log4j.Logger;
import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Test;import static org.junit.Assert.*;public class TestClassE {
private static final Logger log = Logger.getLogger(TestClassE.class);
private static ClassE a;
private static ClassE b;
private static ClassE c;
private static ClassE d;
private static TestClassE main;
private static String s1;
private static String s2;
@BeforeClass
public static void setUpBeforeClass() throws Exception {
a = new ClassE();
b = new ClassE();
c = new ClassE();
d = new ClassE();
main = new TestClassE();
s1 = new String();
s2 = new String();
} @AfterClass
public static void tearDownAfterClass() throws Exception {
}
@Test
public void aEqualsB() throws Exception {
a.i = 1;
b.i = 2;
a = b;
b.i = 3;
assertTrue(a.i == 3);
}
@Test
public void revalueC() throws Exception {
c.i = 1;
main.revalue(c);
assertTrue(c.i == 1);
}
@Test
public void testString() throws Exception {
s1 = "a";
s2 = "b";
s1 = s2;
s2 = "c";
assertTrue(s1.equals("b"));
}
public void revalue(ClassE c) {
d.i = 2;
log.info(c.i);
c = d;
d.i = 3;
log.info(c.i);
}
}
ClassE a = new ClassE();
ClassE b = new ClassE(); //创建两个对象 a.i=1;
b.i=2; //两个对象有不同的值
b=a; //让b(b只是一个引用变量,它可以引用任何同类型的对象)也引用a所引用的对象,以后用b或者a都操作同一对象
b.i=3; //这里实际也就是改变了a所指向的对象,因为a,b都是引用了同一对象 System.out.println(a.i); //这里当然是3了