27 lutego 2008

SCJP - Modyfikatory dla deklaracji klas

Modyfikatory dla deklaracji klas, czyli streszczenie sekcji "Class Declarations and Modifiers" – kontynuacja działań zapowiedzianych w artykule "Przygotowania do SCJP czas zacząć".

Java 5 określa cztery modyfikatory, które mogą być użyte w deklaracji klasy. Dzielą się one na dwie kategorie. Pierwsza to modyfikatory widoczności, czyli w kontekście klas tylko public, alternatywnie brak modyfikatora widoczności. Druga to modyfikatory innego typu, czyli strictfp, final i abstract.

Zacznijmy od modyfikatorów widoczności. Deklarację klasy możemy ozdobić modyfikatorem public. Możemy też nie specyfikować zakresu widoczności, efektywnym będzie wówczas zakres domyślny. Modyfikator public oznacza, że klasa będzie widoczna dla każdej innej klasy. Brak modyfikatora, czyli zakres domyślny spowoduje, że klasa będzie widoczna tylko i wyłącznie dla klas zdefiniowanych w tym samym pakiecie.

Modyfikator strictfp oznacza, że wszystkie operacje zmiennoprzecinkowe w danej klasie będą zgodne ze standardem IEEE 754, tj. wirtualna maszyna Javy wykona instrukcje zmiennoprzecinkowe w sposób zgodny z tym standardem. Jak napisano w Książce, nie musimy wiedzieć co to dokładnie oznacza. Trzeba jeszcze wiedzieć, że modyfikator ten może być zastosowany tylko przy deklaracji klasy lub metody, ale nigdy przy deklaracji zmiennej. Dotyczy on w końcu operacji, także wydaje się to być dosyć oczywiste.

Została jeszcze para modyfikatorów final i abstract. Pierwszą rzeczą, z której trzeba sobie zdawać sprawę jest to, że można użyć tylko jednego z nich na raz. Klasa nie może być zadeklarowana jednocześnie final i abstract.

Zadeklarowanie klasy jako final oznacza, że nie może ona być rozszerzona, tj. nie można zadeklarować innej klasy jako podklasy klasy final. Jeśli więc klasa A jest final, to nie będzie można zadeklarować ‘class B extends A’. To tyle.

Zadeklarowanie klasy jako abstract oznacza, że nie będzie możliwe utworzenie żadnej instancji tej klasy. Do czego potrzebna jest więc taka klasa? No cóż, jest to taki "interfejs z częściową implementacją". Klasa abstrakcyjna – tj. oznaczona słówkiem kluczowym abstract – zawiera pewną liczbę (być może 0) metod abstrakcyjnych i pewną liczbę (być może 0) metod z implementacją (oraz wszelkie inne deklaracje, które może zawierać "zwykła" klasa). Metody abstrakcyjne to metody, które nie posiadają implementacji, zamiast kodu ujętego w nawiasy klamrowe umieszczamy więc na końcu deklaracji średnik – tak jak przy deklaracji metod w interfejsach. Uwaga! Klasa abstrakcyjna wcale nie musi zawierać metod abstrakcyjnych, ale jeśli któraś z metod w klasie jest abstrakcyjna, to również ta klasa musi być zadeklarowana jako abstract. Przykład klasy abstrakcyjnej poniżej.

public abstract class CollectionModifier {

public void modifyElements(Collection collection) {
for(Object obj : collection) {
this.operation(obj);
}
}

protected abstract void operation(Object obj);
}

5 komentarzy:

Anonimowy pisze...

modyfikatory stojące przy klasach mogą być też private i protected ale tylko w klasach wewnętrznych i zagnieżdzonych

Mariusz Lipiński pisze...

Tak,

wielkie dzięki za uzupełnienie! W referowanym przeze mnie rozdziale Książki rzeczywiście klasy wewnętrzne były pominięte. Dojdziemy do nich w kolejnych artykułach.

Ris pisze...

Możesz podać z jakiej dokładnie książki korzystasz ?

Mariusz Lipiński pisze...

Podałem,

we wspomnianym artykule "Przygotowania do SCJP czas zacząć".

Mariusz Lipiński pisze...

Jeszcze jedno uzupełnienie,

klasy zagnieżdżone mogą być także static, ale tak jak napisałem, o klasach zagnieżdżonych będzie później.