« poprzedni punkt  następny punkt »

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

Problem 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:

Problempublic 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.

Rys

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.


« poprzedni punkt  następny punkt »