看以下代码,先别运行,预测一下输出结果。
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;
}

解决方案 »

  1.   

    此回复为自动发出,仅用于显示而已,并无任何其他特殊作用
    楼主【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  %                  
    敬礼!
      

  2.   

    3
    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引用的对象不存在影响.
      

  3.   

    第三阶段是b写错了.
    第一个考查的是对象,与变量的问题,
    第二个表示的是,参数传的是值,还是地址的问题
    第三个String是一个类所以每一个字符串就是一个对象实例.
      

  4.   

    本帖最后由 AWUSOFT 于 2008-07-16 17:52:32 编辑
      

  5.   

    /********第一段*******************/ 
    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了
      

  6.   

    本帖最后由 AWUSOFT 于 2008-07-16 18:01:57 编辑
      

  7.   


    /********第三段*******************/ 
    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"这个对象的} 
      

  8.   


    看了你说的恍然大悟 呼呼。谢谢刚研究java.
      

  9.   

    3 3 b !
    (敢向我扔砖头的朋友先运行试试看!PS:我发誓没运行过)
      

  10.   

    学到了 原来JAVA中所有的东西都是值传递只是复制了一个引用 通过引用来改变属性 而引用依旧不影响方法外的
      

  11.   


    我设了断点,测试到revalue()调用结尾,c.i还是3,而且CLASSE c传递的应该是引用,按理说调用完了revalue()之后c.i会跟着改变的,但是还是便会1,你懂的话麻烦告诉我为什么...
      

  12.   



    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引用的对象不存在影响. 
      

  13.   

    可能是我语言表达的不好比如传入一个应用d
    在方法里传入的实际上是d这个引用的地址
    然后在方法内部又生成了一个d指向这个地址 方法里的d与传入之前的d指向同一地址
    然后
    E e = new 了一个E();
    e.i=3;
    d = e;//这时仅仅是方法内部的d指向了 新分配的地址
    d.i的值就是3
    然后方法结束 方法内部的e 和 d 被当作垃圾回收外部的引用d不受影响如果这么理解不对的话希望大侠们帮帮偶
      

  14.   

    哦,也就是说revalue()里的"c=d;"改成"d=c;",结果就是33b了,大意了~
      

  15.   

    3
    1
    b  1.a指向了b引用的对象
    2.方法revalue中的参数ClassE c只是传入参数的引用地址拷贝。至于在方法内部有c=d,这个c跟方法外部调用的c是两码事
    3.s1指向了s2引用的对象
      

  16.   

    s1=s2; //让s1引用s2所引用的对象,也就是s1这时候也引用"b"这个对对象 
    s1还引用"a"吗?
    我要打印出"a"拿哪个啊,现在是不是没有指向"a"的变量了?
      

  17.   

    java中的字符串是不可改变的.s2="c";//s2被指向一个新的对象"c",并不改变"b"这个对象
      

  18.   

    这里说的很对,函数里面ClassE d = new ClassE(); 创建了一个新的对象使得引用d指向一个新地址,而c=d是引用d对c的赋值从而使得d也指向了d所指向的地址,但是原来的引用d的地址并没改变!大家说是不是这样?
      

  19.   

    晕!打错字了,c=d是引用d对c的赋值从而使得c也指向了d所指向的地址
      

  20.   


    /********第三段*******************/ 
    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
      

  21.   

    /********第三段*******************/ 
    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"这个对象的 } 为什么之前第一段那是同时引用了一个对象..而这里也是...为什么上面那个引用的对象改了..就一起改..这里就只改了一个的~?
      

  22.   

    第一阶段3
    第二阶段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);

    }
      

  23.   

    /********第一段*******************/ 
    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了