2009-05-17 9 views
23

Jaka jest różnica między w następujących sprawozdaniachString i końcowa

String name = "Tiger"; 

final String name ="Tiger"; 

Chociaż klasa String jest final klasa, dlaczego musimy utworzyć ciąg zmienną „stała” w finale?

+4

Jest to odniesienie do łańcucha, który jest wykonany ostateczny tutaj, a nie sam ciąg. –

Odpowiedz

48

final w tym kontekście oznacza, że ​​zmienną name można przypisać tylko raz. Ponowne przypisanie do niego innego obiektu String powoduje błąd kompilacji.

myślę źródłem zamieszania jest to, że kluczowe final mogą być używane w różnych kontekstach:

  • final class: Klasa nie może być podklasy.
  • ostatnia metoda: Metoda nie może zostać zmieniona.
  • zmienna końcowa: Zmienna może zostać przypisana tylko raz.

Zobacz artykuł z Wikipedii na temat final in Java, gdzie znajdują się przykłady dotyczące każdego przypadku.

+0

Pamiętaj, że "końcowe" to także bezpieczna publikacja do innych wątków (zobacz moją odpowiedź poniżej). –

1

Jesteś niezrozumiały niezmienny z ostatecznym.

Łańcuch, podobnie jak liczba całkowita i długa, jest klasą niezmienną, ponieważ dane wewnętrzne są chronione przed modyfikacją poprzez hermetyzację.

Jednak, jak powiedział Ayman, final odnosi się do wskaźnika do napisu.

2

Pamiętaj, że Java final keyword służy dwóm celom w tym przypadku:

  • oznacza to odwołanie nie może być ustawiony na inny String-- to nie można następnie zrobić „name = ...”;
  • ale najważniejsze, to znaczy, że odwołanie jest prawidłowo opublikowane do innych wątków (patrz powiązany artykuł więcej szczegółów lub roboty takie jak Goetz et al, „Java współbieżności w praktyce”.
+0

Tak, semantyka finału jest bardzo ważna w aplikacjach współbieżności, a nie w zwykłych aplikacjach Java, ponieważ programiści Javy zazwyczaj przejmują zmienność. – egaga

4

„ostateczne "oznacza różne rzeczy w obu przypadkach.

Klasa java.lang.String jest ostateczna. oznacza to, że nie może dziedziczyć po nim.

zmienna«nazwa»jest ostateczna, co oznacza, że ​​można” t Zmień go tak, aby wskazywał na inną instancję String, a więc nie finalną zmienną String nie jest stała, ponieważ można ją przeczytać w dwóch różnych czasach i uzyskać różne wartości.

Tak się składa, że ​​obiekty napisów Java są również niezmienne. Oznacza to, że nie można modyfikować wartości reprezentowanej przez konkretny obiekt String. Porównaj to z tablicą - możesz zastąpić pierwszy element obiektu tablicy innym obiektem, ale nie możesz zastąpić pierwszego znaku obiektu String innym znakiem. Dlatego String.replace() zwraca nowy ciąg znaków - nie może modyfikować starego.

Jednym z powodów, dla których String jest ostateczny, jest zapobieganie przekazywaniu instancji podklasy String, która implementuje zachowanie zmienne, zamiast Stringa.

Ale czy można modyfikować konkretny obiekt i czy można przypisać inny obiekt do zmiennej, są zupełnie różne koncepcje. Jeden jest własnością obiektów String, a drugi jest właściwością zmiennych String, które są odwołaniami do obiektów String.

0

Jeśli zmienna jest oznaczona jako końcowego wówczas wartość tej zmiennej nie może być zmieniany tj końcowego hasła stosowane ze zmienną sprawia, że ​​jest stała. A jeśli spróbujesz zmienić wartość tej zmiennej w trakcie programu, kompilator da błąd.

UWAGA: Jeśli zaznaczysz zmienną typu referencyjnego jako ostateczne, że zmienna nie może odnosić się do jakiegokolwiek innego obiektu. Można jednak zmienić zawartość obiektu, ponieważ tylko samo odniesienie jest ostateczne.

ŹRÓDŁO: Final Keyword in Java

Powiązane problemy