/ / Dlaczego deklaracja końcowej tablicy nie spowoduje, że będzie niezmienna w Javie? - java, niezmienność, wersja ostateczna

Dlaczego nie zadeklarowanie ostatecznej tablicy sprawi, że będzie ona niezmienna w Javie? - java, niezmienność, finał

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 1

final 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.