2012-02-28 44 views
10
public class J { 

    public Integer method(Integer x) 
     { 
      Integer val = x; 
      try 
      { 

        return val; 
      } 
      finally 
      { 
        val = x + x; 
      } 
     } 
     public static void main(String[] args) 
     { 
      J littleFuzzy = new J(); 
      System.out.println(littleFuzzy.method(new Integer(10))); 
     } 

} 

它会返回“10”。返回语句在catch中的行为,最后是

现在我只是将返回类型Integer替换为StringBuilder,并且更改了输出。

public class I { 

    public StringBuilder method(StringBuilder x) 
     { 
      StringBuilder val = x; 
      try 
      { 

        return val; 
      } 
      finally 
      { 
        val = x.append("aaa"); 
      } 
     } 
     public static void main(String[] args) 
     { 
      I littleFuzzy = new I(); 
      System.out.println(littleFuzzy.method(new StringBuilder("abc"))); 
     } 


} 

输出为 “abcaaa”

所以,任何人都可以解释我详细? 有什么区别。?

+0

我在我的机器上执行这个程序时也感到困惑。在第一种情况下它返回10(我期待它会返回20),第二种情况下它返回abcaaa(即在追加后)。我也对这种行为感到困惑。 (在我之间不是谁upvoted它。) – JProgrammer 2012-02-28 05:58:11

+0

它是一个很好的问题。回想一下基本的一些回忆。那有什么不对? – Siddharth 2012-02-28 06:00:00

回答

4

只是因为在immutable整数所以方法后返回即使值在方法也不能反映变化,在StringBuilder对象确实反映

编辑:

public class J { 
    public String method(String x) { 
     String val = x; 
     try { 
      return val; 
     } finally { 
      val = x + x; 
     } 
    } 

    public static void main(String[] args) { 
     J littleFuzzy = new J(); 
     System.out.println(littleFuzzy.method("abc")); 
    } 
} 
+0

不,字符串与整数相同,因为它是不可变的,请参阅我的编辑示例并执行它 – 2012-02-28 06:03:28

+0

如果你把'return val;'finally'finally'改为'Integer',那么值就会改变 – Shahzeb 2012-02-28 06:07:03

+0

@ Nirmal-thInkbeYond,你确定这是事实吗?我认为在这里返回值总是与传递的参数相同,即'x'。并且在StringBuilder方法的情况下,因为通过调用append()方法改变x的值,它会反映到返回的值中。尝试改变'val = x.append(“aaa”);''用'val = new StringBuilder(“aaa”);'用StringBuilder方法(StringBuilder x)''。 – 2012-02-28 06:17:02

0

StringBuilder的主要操作是append和insert方法,它们被重载以接受任何类型的数据。每个函数都有效地将给定的数据转换为字符串,然后将该字符串的字符追加或插入到字符串构建器中。 append方法总是在构建器的最后添加这些字符;插入方法在指定的点添加字符。例如,如果z引用当前内容为“start”的字符串构建器对象,则方法调用z.append(“le”)将导致字符串构建器包含“startle”,而z.insert (4,“le”)会改变字符串生成器以包含“starlet”。通常,如果sb引用StringBuilder的一个实例,则sb.append(x)与sb.insert(sb.length(),x)具有相同的效果。每个字符串生成器都有一个容量。只要包含在字符串构建器中的字符序列的长度不超过容量,就不需要分配新的内部缓冲区。如果内部缓冲区溢出,它会自动变大。

StringBuilder的实例对于多线程使用并不安全。如果需要这种同步,那么建议使用StringBuffer。

在上面的方法中,finally块每次都在调用。

0

当一个对象被传递时,其引用的副本将被传递,如果该内容是可变的,则可以更改它的内容。