12、分析下面的代码,其输出结果是( )。
  1. public class Test {
  2. public static void main (String [] args) {
  3. string foo = "blue";
  4. string bar = foo;
  5. foo = "green";
  6. System.out.printIn(bar);
  7. }
  8. }
  A. 一个异常抛出
  B. 代码无法编译
  C. null
  D. blue
  E. green
  知识点列表:4.1 系统定义的类(包)。
正确答案是选择D,我是选择E,我是认为在第四行,bar不是已经引用了foo的内存地址,然后又把”green“赋予给foo,不就相当与给foo里"blue"重新赋予green值吗,我搞混了,望高手请教下

解决方案 »

  1.   

    string bar = foo;
    这句话只是把 foo的值"blue"赋值上去
    而不是地址啊,
    你可以在第4句后面加
    System.out.println(foo.equals(bar));
    System.out.println(foo==bar);
    第一个打印出true,第二个为false
    表示值一样,而指向的内存地址不一样
      

  2.   

    bar不是已经引用了foo的内存地址bar和foo的内存地址是不同的
    他们都指向相同的内容blue之后foo的内容变成了green但bar的内容还是blue
      

  3.   

    这题跟下面的道理是一样的:
    public static void change(String s) {
    s = "222";
    } public static void main(String[] args) {
    String s = "111";
    change(s);
    System.out.println(s);// 输出什么?
    }
      

  4.   

    关键在于第四句话的理解
    4. string bar = foo;这就话使得bar也指向了blue,而不是指向foo。
      

  5.   

     1. public class Test { 
      2. public static void main (String [] args) { 
      3. string foo = "blue";   //foo指向blue
      4. string bar = foo;      //bar指向blue 
      5. foo = "green";         //foo转而指向green,并不是green盖掉了blue,而是指针改变了指向
      6. System.out.printIn(bar);      //打印bar指向的内容,仍然是blue
      7. } 
      8. } 
      

  6.   

    一楼的有点问题:
    “你可以在第4句后面加 
      System.out.println(foo.equals(bar)); 
      System.out.println(foo==bar); 
      第一个打印出true,第二个为false ”
    应该两个都是true;
    字符串;String s = "abc"; 和 String s = new String("abc");是不同的;
    我想这个大家都也该很了解了,我也不在这里啰嗦了,只是发现一个问题,纠正一下。
      

  7.   

    赋值是将该对象赋值给变量而不是将对象的地址赋值给变量,执行到第四行结果是:bar=blue,foo=blue;执行到
    第五行的结果是:foo=green。
      

  8.   

    用白话说,string bar = foo;就赋值了一次,没把两个变量绑定起来