Poniżej znajduje się przykładowa definicja interfejsu napisana w Javie. Pierwsze pytanie brzmi, które elementy tej definicji są poprawne? Drugie, jak poszczególne (poprawne) elementy zachowają się podczas implementacji interfejsu?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | public interface InterfaceTest { // definicje pól int x1 = 1; public int x2 = 2; protected int x3 = 3; private int x4 = 4; static int x5 = 5; public static final int x6 = 6; final int x7 = 7; // metody int f1(); public int f2(); private int f3(); protected int f4(); } |
Poprawnie są zdefiniowane następujące pola: x1
, x2
, x5
, x6
, x7
oraz metody f1()
i f2()
.
Błędne natomiast są definicje dla x3
, x4
oraz f3()
i f4()
. Dlaczego?
Interfejs w praktyce definiuje nam zestaw pewnych publicznych metod, które zapewniają nam możliwość wywoływania określonych akcji na obiekcie. Z tego powodu w definicji interfejsu są dopuszczalne jedynie użycie modyfikatora public
lub też jego brak (wtedy definicja także staje się publiczna). Inne przypadki są niedozwolone.
A teraz drugie pytanie, czy są jakieś różnice w dostępie do poszczególnych pól zdefiniowanych w interfejsie? Oto przykładowa klasa implementująca powyższy interfejs:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | class Test implements InterfaceTest { @Override public int f1() { x1 = 0; x2 = 0; x5 = 0; x6 = 0; x7 = 0; return 0; } @Override public int f2() { return 0; } } |
Jak widać w klasie Test
są zaimplementowane dwie metody f1()
oraz f2()
. W metodzie f1()
następuje przypisanie nowej wartości zmiennym z interfejsu. Które przypisanie jest poprawne?
Odpowiedź: żadne. Dlaczego? Ponieważ definicje pól w interfejsie zawszą są finalne i statyczne.
Podsumowując, zasady jakie panują podczas definicji poszczególnych elementu interfejsu:
Pola interfejsu
- mogą być tylko publiczne i tak są domyślnie definiowane
- zawsze są statyczne
- zawsze są finalne
Metody
- mogą być tylko publiczne
- nie mogą byś statyczne
- nie mogą być finalne