To bardziej kwestia stylistyczna niż bezpośredni problem. Sugeruje, że nie przemyślałeś właściwie tego, co dzieje się na zajęciach.
Zastanów się, co to static
znaczy:
Ta zmienna istnieje na poziomie klasy, nie istnieje oddzielnie dla każdej instancji i nie istnieje niezależnie w klasach, które mnie rozszerzają .
Zastanów się, co to protected
znaczy:
Tę zmienną można zobaczyć przez tę klasę, klasy w tym samym pakiecie i klasy, które mnie rozszerzają .
Te dwa znaczenia nie wykluczają się wzajemnie, ale są dość bliskie.
Jedynym przypadkiem, w którym mogę zobaczyć, gdzie możesz użyć tych dwóch razem, jest to, że masz klasę abstrakcyjną, która została zaprojektowana do rozszerzania, a klasa rozszerzająca mogłaby następnie zmodyfikować zachowanie za pomocą stałych zdefiniowanych w oryginale. Taki układ najprawdopodobniej skończyłby się jednak bardzo niechlujnie i wskazuje na słabość w projekcie zajęć.
W większości przypadków lepiej byłoby mieć stałe jako publiczne, ponieważ to po prostu czyni wszystko czystszym i pozwala ludziom na tworzenie podklas na większą elastyczność. Zupełnie niezależnie od wszystkiego innego, w wielu przypadkach kompozycja jest lepsza niż dziedziczenie, podczas gdy klasy abstrakcyjne wymuszają dziedziczenie.
Aby zobaczyć jeden przykład, jak to może zepsuć rzeczy i zilustrować, co mam na myśli mówiąc, że zmienna nie ma niezależnego istnienia, spróbuj tego przykładowego kodu:
public class Program {
public static void main (String[] args) throws java.lang.Exception {
System.out.println(new Test2().getTest());
Test.test = "changed";
System.out.println(new Test2().getTest());
}
}
abstract class Test {
protected static String test = "test";
}
class Test2 extends Test {
public String getTest() {
return test;
}
}
Zobaczysz wyniki:
test
changed
Wypróbuj sam na: https://ideone.com/KM8u8O
Klasa Test2
jest w stanie uzyskać dostęp do elementu statycznego test
od Test
bez konieczności zakwalifikowania nazwy - ale nie dziedziczy albo dostać własną kopię. Patrzy dokładnie na ten sam obiekt w pamięci.
final
. Zmienne pole statyczne współdzielone między klasami jest zdecydowanie powodem do zmartwień. Wiele klas aktualizujących pole statyczne prawdopodobnie nie będzie niezawodne lub łatwe do naśladowania, zwłaszcza że obecność jakiegokolwiek chronionego pola lub metody oznacza, że klasa ma zostać rozszerzona o klasy w innych pakietach, być może klasy nie będące pod kontrolą autor klasy zawierającej chronione pole.