Jaka jest różnica między final i static w Javie?


Najlepsza odpowiedź

Uh, to zupełnie różne koncepcje.

Członek oznaczony jako statyczny należy do klasy, a nie do jakiejś konkretnej instancji. Czasami klasy mogą mieć tylko statyczne elementy członkowskie, czego oczywistym przykładem jest klasa java.lang.Double, która „opakowuje” podwójne prymitywy: wartość pojedynczego obiektu double można uzyskać za pomocą metody instancji (myDouble.doubleValue()), ale otrzymuj „uniwersalne” rzeczy poprzez statyczne elementy składowe (Double.MAX\_VALUE).

Element oznaczony jako ostateczny nie może * mieć swojej wartości (czyli wartości jeśli jest pierwotny, lub jego odniesienie , jeśli obiekt) zmieniło się po zainicjowaniu. Nadal możesz mieć możliwość zmiany obiektu (może być zmienny ) ale nie można było * zastąpić obiektu innym. (* Technicznie możesz „oszukiwać” za pomocą odbicia, manipulacji kodem bajtowym lub innymi sposobami „łamania zasad”, ale jeśli to robisz, prawdopodobnie wiesz re „oszukiwanie”.)

Odpowiedź

Aby wiedzieć, kiedy użyć

private static final X x;

Powinieneś wiedzieć, jakie jest zastosowanie tych słów kluczowych.

Zobaczmy

  1. prywatne – jest używane, gdy chcesz ograniczyć określonego członka klasy do być niedostępne poza tą klasą.
  2. statyczny – Kiedy deklarujesz statyczny element członkowski, jest on powiązany ze swoją klasą, a nie obiektem. Aby to uprościć, statyczny element członkowski zostanie zainicjowany podczas ładowania klasy. Tak więc za każdym razem, gdy aktualizujesz wartość tego elementu, wszystkie miejsca, do których się on odwołuje, również zostaną zaktualizowane. W związku z tym statyczny element członkowski jest dostępny przez nazwę klasy, a nie ich obiekty, ponieważ wartość elementu pozostanie taka sama niezależnie od obiektów.
  3. final – to słowo kluczowe, używane ze zmiennymi składowymi, określa, że ​​po załadowaniu klasy i przypisaniu wartości nie można jej zmienić.

Zobaczmy więc, co się stanie kiedy deklarujesz zmienną taką jak poniżej:

private static final String PRIVATE\_STATIC\_FINAL\_STRING = "String";

Teraz

PRIVATE\_STATIC\_FINAL\_STRING jest zdefiniowany jako prywatny, więc wygrał „t być dostępny poza deklarowaną klasą”. Jest również zdefiniowana jako statyczna, więc jej wartość pozostanie taka sama niezależnie od obiektów jej klasy. I jest zdefiniowana jako ostateczna, więc po załadowaniu klasy jej wartość nie zostanie zmieniona.

Dlatego PRIVATE\_STATIC\_FINAL\_STRING będzie działał jako niemodyfikowalny ciąg poziomu klasy, który nie będzie dostępny poza zadeklarowaną klasą.

Mam nadzieję, że pomoże ci to wyjaśnić twoje wątpliwości. Jeśli potrzebujesz dalszej pomocy, możesz się ze mną skontaktować, a postaram się pomóc Ci tak bardzo, jak tylko będę mógł.

Powodzenia i szczęśliwej nauki!

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *