2. Definiowanie atrybutów obiektów (pola)
Pola klasy określają z jakich elementów będą składać się obiekty tej klasy.
Na przykład obiekty-pary liczb całkowitych składają się z dwóch liczb całkowitych.
W definicji klasy Para trzeba to jakoś zapisać. Naturalnym sposobem jest zadeklarowanie zmiennych odpowiednich typow
public class Para {
int a;
int b;
// dalej będą następować definicje konstruktorów i metod klasy....
}
Taki zapis oznacza, że każdy z obiektów klasy Para będzie zawierał dwie
liczby całkowite. Będzie się składał z dwóch elementów - liczb całkowitych.
Identyfikatory zmiennych (a i b) są oczywiście dowolne, a potrzebne są po
to, by do tych liczb móc odwoływać się w metodach klasy.
Pamiętamy, że jedną z ważnych cech programowania obiektowego jest hermetyzacja.
Polega ona (między innymi) na tym, że działając na obiektach jakiejś klasy
powinniśmy wyłącznie posługiwac się dostępnymi dla nas jej metodami, a nie
grzebać w "środku obiektów".
Dlatego pola klasy deklaruje się zwykle ze specyfikatorem dostępu private, co oznacza, że dostęp do nich możliwy jest tylko z wnętrza danej klasy
(m.in z jej metod), a odwołania spoza klasy są niedopuszczalne.
Definiowanie pól klasy
[ public] class NazwaKlasy {
[ specyfikator_dostępu ] nazwa_typu nazwa_zmiennej [ inicjator ];
//....
}
uwaga:
- nawiasy kwadratowe oznaczają opcjonalność elementów definicji
- specyfikator dostępu to zwykle private
- inicjator ma znaną nam postać wyrażenia po znaku =; więcej na ten temat w podpunkcie dotyczącym jawnych inicjacji
Na przykład:
public class Para {
private int a;
private int b;
// ...
}
Polami klasy mogą być zmienne obiektowe (zmienne oznaczające obiekty; ściślej
powiemy: zmienne typów referencyjnych). Zobaczmy jak mógłby wyglądać fragment
definicji klasy Book, która opisuje książki:
public class Book {
private String author; // autor
private String title; // tytuł
private double price; // cena
// ....
}
Zmienne typu String są referencjami, będą wskazywać na odpowiednie obiekty - łańcuchy znakowe.
Pojęcie pola dotyczy klasy, pojęcie elementu - dotyczy obiektu.
Dla uproszczenia będziemy jednak czasem mówić "pole obiektu".
Należy wyraźnie
dostrzegać różnicę pomiędzy definicją pól klasy, a elementami obiektów. Zestaw
pól klasy określa jakie elementy mogą mieć obiekty tej klasy. Elementy są
natomiast konkretnymi obszarami pamięci alokowanymi "w środku" konkretnych
obiektów.
Np. definicja klasa Para mówi o tym, że każdy jej obiekt zawiera dwa elementy
- liczby całkowite. Po utworzeniu obiektu i jego inicjacji (bądż np. użyciu
metody set, ustalającej wartość pary) obiekt będzie zawierał dwa elementy
- liczby całkowite o konkretnych wartościach. Inny obiekt klasy Para będzie
też zawierał dwie liczby całkowite, ale (być może) o innych wartościach niż
ten pierwszy.
Co się stanie, jeśli - ani za pomocą konstruktora, ani w inny sposób - nie
ustalimy przy tworzeniu obiektu wartości jego elementów? Elementy obiektu będą miały wartości domyślne.
Domyślnie, przy tworzeniu obiektów, pola klasy otrzymują wartość ZERO, co
-
dla typów całkowitych oznacza liczbę całkowitą 0,
-
dla typów rzeczywistych oznacza wartość rzeczywistą 0.
-
dla typu boolean oznacza wartość false,
-
dla typów referencyjnych oznacza wartość null (referencja nie wskazuje na żaden obiekt)
Np. przy takiej definicji klasy:
class Person {
private String name;
private int age;
private boolean isEmployee;
}
po utworzeniu obiektu tej klasy, jego elementy odpowiadające polom name,
age i isEmployee będą miały wartości - odpowiednio - null, 0 i false.
|