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

} 

To spowoduje powrót "10".Zachowanie instrukcji return w haku, a na końcu

Teraz po prostu zamieniam zwracany typ Integer na StringBuilder, a wynik został zmieniony.

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


} 

wyjście jest "abcaaa"

Więc ktoś może mi wyjaśnić szczegółowo.? jakie są różnice.?

+0

Jestem również zdezorientowany, gdy wykonałem ten program na moim komputerze. W pierwszym przypadku zwraca 10 (spodziewałem się, że zwróci 20), w drugim przypadku zwraca abcaaa (czyli po dołączeniu). Jestem także zdziwiony tym zachowaniem. (między mną nie jestem tym, który go przegłosował.).). – JProgrammer

+0

To jest dobre pytanie. Wróciło wspomnienie podstawowych rzeczy. Co z tym jest nie tak ? – Siddharth

Odpowiedz

4

Tylko dlatego całkowitą w immutable więc po sposobie powraca, nawet jeśli wartość jest zmieniana w sposób nie odzwierciedla i oddaje w 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

no, Łańcuch jest taki sam jak liczba całkowita, ponieważ jest niezmienny, zobacz mój przykład edycji i wykonaj go –

+0

jeśli umieścisz 'return val;' outside 'finally', wtedy wartość zostanie zmieniona nawet dla' Integer' – Shahzeb

+0

@ Nirmal-thInkbeYond, czy na pewno tak jest? Myślę, że tutaj wartość zwracana jest zawsze taka sama jak przekazany parametr, to jest 'x'. A w przypadku metody 'StringBuilder', ponieważ wartość x jest zmieniana przez wywołanie metody' append() ', zostaje ona odzwierciedlona w zwróconej wartości. Spróbuj zmienić 'val = x.append (" aaa ");' z 'val = new StringBuilder (" aaa ");' w przypadku 'metody StringBuilder (StringBuilder x)'. –

0

Główne operacje na StringBuilder to metody dołączania i wstawiania, które są przeciążane w celu akceptowania danych dowolnego typu. Każdy skutecznie konwertuje dany punkt odniesienia na ciąg znaków, a następnie dołącza lub wstawia znaki tego ciągu do konstruktora ciągów. Metoda dołączania zawsze dodaje te znaki na końcu konstruktora; metoda wstawiania dodaje znaki w określonym punkcie.

Na przykład, jeśli z odnosi się do obiektu konstruktora ciągów, którego bieżąca zawartość to "start", wówczas wywołanie metody z.append ("le") spowodowałoby, że konstruktor łańcuchów zawierałby "startle", podczas gdy z.insert (4, "le") zmieniłoby konstruktor stringów tak, by zawierało "gwiazdkę".

Ogólnie rzecz biorąc, jeśli sb odnosi się do instancji StringBuilder, wówczas sb.append (x) ma taki sam efekt jak sb.insert (sb.length(), x). Każdy twórca ciągów ma pojemność. Dopóki długość sekwencji znaków zawartej w konstruktorze ciągów nie przekracza pojemności, nie jest konieczne przydzielanie nowego bufora wewnętrznego. Jeśli bufor wewnętrzny przepełni się, zostanie automatycznie powiększony.

Wystąpienia StringBuilder nie są bezpieczne w użyciu dla wielu wątków. Jeśli taka synchronizacja jest wymagana, zaleca się użycie StringBuffer.

W powyższej metodzie ostatecznie blok wywołuje za każdym razem.

0

gdy obiekt jest przekazywana, kopia odwołania jest przekazywana i możesz zmienić zawartość, jeśli jest zmienna.

Powiązane problemy