Dlaczego „nie zadeklarowanie ostatecznej tablicy nie czyni jej niezmienną w Javie?” Czy „deklarowanie czegoś ostatecznego” nie oznacza, że nie można go zmienić?
Od pytanie związane z niezmienną tablicą jasne jest, że deklaracja końcowej tablicy nie powoduje, że jest ona niezmienna.
Możliwe jest:
final int[] array = new int[] {0, 1, 2, 3};
array[0] = 42;
Moje pytanie brzmi: jaka jest zatem funkcja ogłaszania tutaj ostatecznego?
Odpowiedzi:
32 dla odpowiedzi nr 1final
dotyczy tylko odniesienie to jest naznaczone; nie ma czegoś takiego jak niezmienna tablica w Javie. Kiedy powiesz
private final int[] xs = new int[20];
nie będziesz mógł powiedzieć
xs = new int[10];
później. Jest to wszystko co final
jest o. Mówiąc bardziej ogólnie, upewnienie się, że obiekt jest niezmienny, jest często ciężką pracą i pełną gamą subtelności. Sam język nie daje wiele do końca po wyjęciu z pudełka.
7 dla odpowiedzi nr 2
final
oznacza, że nie możesz zmienić odniesienie - tzn. nie możesz przypisać innej tablicy do tego pola.
„Niezmienny” oznacza, że nie możesz zmienić zawartość tablicy - final
nie ma na to wpływu.
Jak pokazuje Twój kod, możesz przypisać wartość do jeden z elementów tablicy, która nie zmienia odniesienie do tablica
3 dla odpowiedzi nr 3
Tutaj robisz odniesienie do obiektu final
, nie prymitywne. (Tablice są również specjalnymi obiektami Java). Odniesienie final
oznacza, że po zainicjowaniu nie możesz sprawić, by polecił coś innego. Ale oczywiście możesz zmienić stan obiektu, do którego odwołuje się zmienna końcowa.
1 dla odpowiedzi nr 4
deklarowanie tablicy
W Javie deklarujemy zmiennei tworzyć obiekty (takie jak tablice). Działania te są niezależne; możemy zadeklarować zmienną bez tworzenia obiektu i stworzyć obiekt bez deklarowania zmiennej.
Niezmienność jest właściwością obiektu, natomiast właściwość final jest właściwością zmiennej. Do obiektu może odwoływać się kilka zmiennych. Która zmienna powinna rządzić niezmiennością obiektu tablicy?
int[] a = {1,2,3};
final int[] b = a;
a[0] = 10; // should this be legal?
Jeśli pozwolimy na to, rzekomo niezmienna wartość b[0]
został zmieniony. Ale w jaki sposób kompilator może temu zapobiec? Czy uniemożliwiając przypisanie niefinału do ostatecznego odniesienia? Jak więc zainicjowałbym tablicę? Nie mogłem tego zrobić w pętli ...
I: Co to znaczy, że tablica jest niezmienna? Na przykład, czy poniższe powinny się kompilować?
final int[][] a = {{1,2}, {3,4}};
a[1][1] = 5;
C ++ rozwiązuje to poprzez zezwolenie const
do określenia (lub pominięcia) dla każdego poziomu pośrednictwa. W Javie wartość końcową można podać (lub pominąć) raz dla każdej zmiennej. Tak, final
jest prostsze const
, podobnie jak Java jest prostszym C ++. Uprośćmy to, prawda?
0 dla odpowiedzi № 5
Oznacza to, że nowe wystąpienie obiektu nie będzie dozwolone.
0 dla odpowiedzi № 6
Jak wszyscy komentowali, zadeklarowanie go jako ostatecznego nie pozwoli ci przypisać innej tablicy do zmiennej. Czytaj więcej tutaj
Sama tablica zachowa swoje właściwości tak samo jak poprzednio.