2012-02-28 23 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))); 
     } 

} 

Nó sẽ trả về "10".Hành vi của tuyên bố trả lại khi bắt và cuối cùng là

Bây giờ tôi chỉ cần thay thế kiểu số nguyên trả về thành StringBuilder và đầu ra đã được thay đổi.

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"))); 
     } 


} 

ra là "abcaaa"

Vì vậy, Ai cũng có thể giải thích cho tôi một cách chi tiết.? sự khác biệt là gì.?

+0

Tôi cũng bối rối khi tôi thực hiện chương trình này trên máy của mình. Trong trường hợp đầu tiên nó quay trở lại 10 (tôi đã mong đợi nó sẽ trở lại 20), trong trường hợp thứ hai nó trở về abcaaa (đó là sau khi phụ thêm). Tôi cũng bối rối trước hành vi này. (ở giữa tôi không phải là người đã bỏ phiếu cho nó.) – JProgrammer

+0

Đó là một câu hỏi hay. Đã lấy lại một số kỷ niệm của cơ bản. Có gì sai với điều đó? – Siddharth

Trả lời

4

Chỉ vì số nguyên trong immutable như vậy sau khi phương thức trả về ngay cả khi giá trị được thay đổi trong phương pháp nó không phản ánh, và không phản ánh trong StringBuilder Object

EDIT:

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

không, String là trường hợp giống như số nguyên vì nó là bất biến, xem ví dụ sửa của tôi và thực thi nó –

+0

nếu bạn đặt 'return val;' outside 'finally' thì giá trị được thay đổi ngay cả đối với' Integer' – Shahzeb

+0

@ Nirmal-thInkbeYond, bạn có chắc đây là trường hợp không? Tôi nghĩ ở đây giá trị trả về luôn giống với tham số được chuyển qua tức là 'x'. Và trong trường hợp phương thức 'StringBuilder' vì giá trị của x được thay đổi bằng cách gọi phương thức' append() ', nó được phản ánh trong giá trị trả về. Hãy thử thay đổi 'val = x.append (" aaa ");' với 'val = new StringBuilder (" aaa ");' trong trường hợp 'StringBuilder method (StringBuilder x)'. –

0

Các hoạt động chính trên StringBuilder là các phương thức chắp thêm và chèn, quá tải để chấp nhận dữ liệu thuộc bất kỳ loại nào. Mỗi hiệu quả chuyển đổi một datum nhất định thành một chuỗi và sau đó nối thêm hoặc chèn các ký tự của chuỗi đó vào trình tạo chuỗi. Phương thức chắp thêm luôn thêm các ký tự này vào cuối trình tạo; phương thức chèn thêm các ký tự tại một điểm xác định. Ví dụ: nếu z đề cập đến đối tượng trình tạo chuỗi có nội dung hiện tại là "bắt đầu", thì lệnh gọi phương thức z.append ("le") sẽ khiến trình tạo chuỗi chứa "startle", trong khi z.insert (4, "le") sẽ thay đổi trình tạo chuỗi để chứa "starlet".

Nói chung, nếu sb đề cập đến một thể hiện của một StringBuilder, thì sb.append (x) có cùng tác dụng như sb.insert (sb.length(), x). Mỗi trình tạo chuỗi có dung lượng. Miễn là độ dài của chuỗi ký tự chứa trong trình tạo chuỗi không vượt quá dung lượng, không cần thiết phải cấp phát một bộ đệm nội bộ mới. Nếu tràn bộ đệm bên trong, nó sẽ tự động được tạo lớn hơn.

Các trường hợp của StringBuilder không an toàn cho nhiều chủ đề sử dụng. Nếu yêu cầu đồng bộ hóa như vậy thì nên sử dụng StringBuffer.

Trong phương pháp trên, cuối cùng, khối đang gọi mọi lúc.

0

Khi một đối tượng được thông qua, bản sao tham chiếu của nó được chuyển và bạn có thể thay đổi nội dung nếu nó có thể thay đổi được.

Các vấn đề liên quan