Witam, mógłby ktoś uzasadnić, dlaczego w klasie wewnętrznej niestatycznej może być pole final static, podczas gdy nie można tworzyć w niej pól statycznych?
- Rejestracja:około 5 lat
- Ostatnio:prawie 4 lata
- Postów:13

- Rejestracja:około 17 lat
- Ostatnio:około 10 godzin
- Postów:1874
A dlaczego ma nie mieć takiej możliwości? Aby zainicjalizować pola statyczne (static final) nie potrzebujesz instancji klasy, więc wydaje się to być jednak logiczne :)
EDIT: to jednak nie takie proste (static final pozwalają, a samo static już nie), bije się w pierś i odpowiadam: nie wiem. Domniemuje, że to rodzi jakieś corner-casy.




- Rejestracja:około 17 lat
- Ostatnio:około 10 godzin
- Postów:1874
Ok chyba znalazłem: https://coderanch.com/t/650397/java/static-final-fields-class
„Dowód nie wprost”: Gdyby dało się ustawiać statici bez final w inner clasie, wówczas jedno pole statyczne mogłoby mieć tyle różnych wartości ile zostało utworzonych klas nadrzędnych. A to przeczy idei statycznego pola, które w danym czasie może mieć jedna wartość (chyba ze zajdzie jakaś czarna magia na poziomie classloaderów i wersji klas, ale na tym się nie znam jeszcze bardziej i to już jakiś hardcore). Może nie do końca precyzyjnie, ale własnymi słowami :)






- Rejestracja:prawie 20 lat
- Ostatnio:29 minut
Podnoszę poprzeczkę :) To poniżej też się nie kompiluje:
public class Main {
class Xxx {
final static int a = "9".length();
}
}
Jedyne czego można użyć w ciele takiego final static
to literały https://en.wikibooks.org/wiki/Java_Programming/Literals oraz inne final static
zawierające literały. Nie można wykonywać na nich metod, dozwolone jest tylko łączenie Stringów i operacje arytmetyczne.
Nie można też rzutować w jakikolwiek sposób, np to się nie skompiluje:
public class Main {
class Xxx {
final static Object a = "0";
}
}




- Rejestracja:około 5 lat
- Ostatnio:około 2 godziny
- Postów:565
Ogólnie z tego co pamiętam developer powinien się dwa razy zastanowić czy na pewno chce stosować słowo kluczowe static z tego względu że pola czy metody oznaczone w ten sposób są przechowywane w oddzielnym sektorze pamięci niż zwykły stack, mało tego, są przetrzymywane przez cały czas działania programu. Można więc rzec że świadomie obcinamy sobie często zupełnie zbędnie cenne miejsce w pamięci. Statyki są nietykalne dla GarbageCollectora.

- Rejestracja:prawie 10 lat
- Ostatnio:10 minut
- Postów:2370
Wibowit napisał(a):
Podnoszę poprzeczkę :) To poniżej też się nie kompiluje:
public class Main { class Xxx { final static int a = "9".length(); } }
Tę poprzeczkę spec wyjaśnia -> "9".length() nie jest const w czasie kompilacji. https://docs.oracle.com/javase/specs/jls/se14/html/jls-8.html#jls-8.1.3
Dlaczego tak design, a nie inny? Nie wiem :-)
