Klasa i obiekt — podstawy programowania obiektowego
W programowaniu obiektowym (OOP) klasa i obiekt to dwa najważniejsze pojęcia. Wokół nich zbudowana jest cała koncepcja podejścia obiektowego — porządkowania kodu w jednostki łączące dane i zachowanie. To jeden z kluczowych tematów w kwalifikacji INF.04 (Projektowanie, programowanie i testowanie aplikacji).

Klasa to wzorzec — opis tego, jakie dane i zachowania będą posiadały obiekty. Można ją porównać do projektu domu albo formularza.
Obiekt to konkretny egzemplarz klasy. Jeśli klasa jest projektem domu, to obiekt jest już wybudowanym domem według tego projektu. Z jednej klasy można utworzyć wiele obiektów, każdy z własnym stanem.
Co zawiera klasa?
Klasa może zawierać:
- pola – zmienne przechowujące stan obiektu,
- właściwości – kontrolowany dostęp do danych,
- metody – funkcje opisujące zachowanie obiektu,
- konstruktory – specjalne metody służące do tworzenia obiektów,
- modyfikatory dostępu – określające, kto może korzystać z pól i metod.
Przykład w Javie
class Uczen {
String imie;
int wiek;
void przedstawSie() {
System.out.println("Mam na imię " + imie);
}
}
Uczen u1 = new Uczen();
u1.imie = "Adam";
u1.wiek = 18;
u1.przedstawSie();
W tym przykładzie Uczen to klasa, u1 to obiekt utworzony na podstawie tej klasy, imie i wiek to pola, a przedstawSie() to metoda.
Jak rozpoznać metodę po wywołaniu?
Jeżeli w kodzie pojawia się zapis typu:
MojaKlasa obj1 = new MojaKlasa();
obj1.rysunek();
to rysunek jest metodą klasy MojaKlasa — wskazują na to nawiasy () przy wywołaniu. Gdyby nawiasów nie było (obj1.rysunek), byłoby to odwołanie do pola lub właściwości.
Konstruktor
Konstruktor to specjalna metoda wywoływana automatycznie przy tworzeniu obiektu. Jego nazwa jest identyczna z nazwą klasy i nie ma typu zwracanego (nawet void).
Dla klasy w C++:
class Owoc {
public:
double waga;
string nazwa;
Owoc(double waga, string nazwa);
};
definicja konstruktora poza klasą wygląda następująco:
Owoc::Owoc(double waga, string nazwa) {
this->waga = waga;
this->nazwa = nazwa;
}
Charakterystyczna jest właśnie nazwa zgodna z klasą (Owoc::Owoc) i brak typu zwracanego.
Modyfikatory dostępu
Modyfikatory dostępu określają, skąd można korzystać z pól i metod klasy. Trzy podstawowe to:
- public — dostępne wszędzie, także przez
nazwaObiektu.nazwaPolaz głównego programu, - protected — dostępne wewnątrz klasy oraz w klasach pochodnych (dziedziczących),
- private — dostępne tylko wewnątrz danej klasy.
Dostęp przez nazwaObiektu.nazwaPola
Z poziomu głównego programu, przez odwołanie w formie nazwaObiektu.nazwaPola, dostępne są tylko pola publiczne (public). Pola private i protected są z tego poziomu niewidoczne.
Modyfikator protected w metodzie
Zapis:
protected void Dodaj() {}
oznacza, że metoda Dodaj() jest dostępna wewnątrz klasy Kalkulator oraz w klasach, które po niej dziedziczą — ale nie z zewnątrz przez obj.Dodaj().
Pole statyczne (static)
Słowo kluczowe static przed polem oznacza, że pole należy do klasy, a nie do pojedynczego obiektu. Wszystkie obiekty współdzielą tę samą wartość.
class MojaKlasa {
private static int licznik;
}
Z definicji private static int licznik wynika, że:
- pole jest wspólne dla wszystkich obiektów klasy (static),
- jest dostępne tylko wewnątrz klasy (private).
Typowe zastosowanie: licznik utworzonych obiektów, wspólne ustawienia.
Filary programowania obiektowego
Podejście obiektowe opiera się na czterech filarach:
1. Hermetyzacja (enkapsulacja)
Zasada ukrywania elementów klasy tak, aby były dostępne wyłącznie dla metod tej klasy (lub funkcji zaprzyjaźnionych). Realizuje się ją głównie przez modyfikator private. Dostęp do ukrytych pól odbywa się przez publiczne metody (gettery/settery) lub właściwości.
2. Dziedziczenie
Dziedziczenie stosuje się, gdy istnieje potrzeba rozszerzenia istniejącej klasy o nowe pola lub metody, bez przepisywania jej od początku. Klasa pochodna dziedziczy wszystko, co ma klasa bazowa (z wyjątkiem elementów private).
W C# zapis:
public class Car : Vehicle { ... }
oznacza, że klasa Car dziedziczy po klasie Vehicle. Car jest klasą pochodną, Vehicle — bazową.
Widoczność pól w klasie pochodnej
public class Customer {
public string Name;
protected int Id;
private int Age;
}
public class GoldCustomer : Customer { ... }
W metodach klasy GoldCustomer dostępne są tylko pola Name (public) i Id (protected). Pole Age jest private, więc mimo dziedziczenia nie jest widoczne w klasie pochodnej.
3. Polimorfizm i słowo kluczowe virtual
Polimorfizm to możliwość, by ten sam interfejs (np. metoda) zachowywał się różnie w różnych klasach. W C++ i C# słowo kluczowe virtual wykorzystuje się w kontekście metod — oznacza, że metoda może być przesłonięta (nadpisana) w klasie pochodnej (przez override).
Przy hierarchii figur geometrycznych (np. Figura → Kolo, Prostokat, Trojkat), wspólną metodę do obliczania pola deklaruje się w klasie bazowej Figura (często jako virtual lub abstrakcyjną), a w klasach pochodnych ją przesłania się zgodnie ze wzorem dla danej figury.
4. Abstrakcja
Upraszczanie modelu — pokazanie tylko tego, co istotne, ukrycie szczegółów implementacji.
Co obejmuje podejście obiektowe?
Obiektowe podejście do rozwiązywania problemów obejmuje między innymi:
- modelowanie problemu za pomocą klas i obiektów,
- stosowanie hermetyzacji, dziedziczenia, polimorfizmu i abstrakcji,
- grupowanie danych i operacji w logiczne jednostki,
- ponowne wykorzystywanie kodu (klasy bazowe, dziedziczenie).
Dlaczego klasy i obiekty są ważne?
Klasy i obiekty pozwalają porządkować kod zgodnie z modelem problemu. Zamiast tworzyć wiele luźnych zmiennych i funkcji, można grupować dane oraz operacje w logiczne jednostki. Dzięki temu program jest czytelniejszy, łatwiejszy w rozbudowie i prostszy w testowaniu.
Częste pomyłki — nie myl tego!
- klasa ≠ obiekt — klasa to wzorzec (typ), obiekt to konkretny egzemplarz utworzony przez
new. - pole ≠ metoda — pole to zmienna (dane), metoda to funkcja (zachowanie); metodę poznasz po nawiasach
()przy wywołaniu. - konstruktor nie ma typu zwracanego — nawet
void; jego nazwa jest taka jak nazwa klasy. - private ≠ protected —
privatenie jest widoczne w klasie pochodnej,protectedjest. - public daje dostęp przez
obj.pole,privateiprotected— nie. - static dotyczy klasy, nie obiektu — pole
staticjest wspólne dla wszystkich obiektów. - virtual w C++/C# dotyczy metod, a nie pól ani klas — pozwala je przesłaniać w klasach pochodnych.
- dziedziczenie nie kopiuje pól
privateklasy bazowej do widoczności klasy pochodnej — one istnieją, ale są niedostępne bezpośrednio.
Najważniejsze do zapamiętania
Klasa to wzorzec, obiekt to jej egzemplarz utworzony przez new. Klasa zawiera pola, metody, konstruktory i korzysta z modyfikatorów dostępu (public, protected, private). Cztery filary OOP to: hermetyzacja (ukrywanie pól przez private), dziedziczenie (rozszerzanie istniejącej klasy, class Car : Vehicle), polimorfizm (m.in. virtual/override w C++/C#) i abstrakcja. Pole static należy do klasy, nie do obiektu. Konstruktor ma nazwę klasy i nie ma typu zwracanego.