Java – obiektowość – klasa, pole, metoda, obiekt

Obiektowość jest jednym z paradygmatów programowania (sposobów programowania), który ułatwia pisanie oraz utrzymanie rozbudowanych programów. Podstawowym elementem tego paradygmatu jest obiekt, który przechowuje dane (pola) ściśle z nim powiązane. Obiekt posiada również metody, które wykonują określone operacje na danych, reprezentują zachowanie obiektu. Java obiektowść, jest tematem tego artykułu.

W tym artykule poznasz jeden z najpopularniejszych paradygmatów programowania. Wiedza zawarta w artykule jest uniwersalna dla wszystkich języków umożliwiających programowanie obiektowe. Założenia są identyczne, różni się sposób zapisu.

Wpis jest kontynuacją serii, w której robię bardzo szybkie wprowadzenie w programowanie w Javie, pokazując jej najważniejsze elementy. Jeśli jakiś fragment nie zostanie omówiony, a zostanie wykorzystany w artykule, oznacza to, że został wytłumaczony w poprzednich wpisach.


Definicje – obiektowość

obiekt – unikalny element, przechowuje stan (pola) oraz zachowanie (metody), np. „Fiat, 1990, 5 999zł”

pole – unikalna informacja o obiekcie, np. marka, rok produkcji, cena

metoda – zachowanie na obiekcie, np. zmień bieg, uruchom, zatrzymaj

klasa – szablon dla obiektów, definiuje jakie pola oraz metody będą posiadały wszystkie obiekty tej samej klasy, np. Samochód

Podobnie jak w poprzednich artykułach, zróbmy założenie, które chcielibyśmy zrealizować. Niech naszym problemem, będzie przygotowanie struktury do przechowywania informacji o pojazdach (samochodach) w salonie. Jak je przechowywać ?

Klasa

Jak już wspomnieliśmy na wstępie, klasa służy do definiowania szablonu dla obiektu. Żeby zdefiniować klasę, wystarczy słowo kluczowe class, nazwa oraz klamry określające gdzie się zaczyna i kończy.

/*
class NazwaKlasy {

}
*/

Ważną informacją o klasie jest to, że każda klasa definiuje nowy typ danych. Do tej pory poznaliśmy jedynie 8 typów prostych, zaś przy pomocy klasy możesz definiować własne typy. Pierwszym z nich będzie typ obiektowy „Samochod”.

class Samochod {

}

Póki co powiedzieliśmy, że jest samochód, teraz przydałoby się określić jaki stan (inaczej dane lub pola) będzie przechowywał obiekt takiej klasy.

Pole

Pole określa atrybut obiektu. W klasie definiujemy jakie pola będą wspólne dla wszystkich obiektów tej klasy. Pola zawsze definiujemy wewnątrz klasy, zwyczajowo na początku jej definicji, choć nie jest to konieczne. Definicja pola nie różni się od definicji zmiennej, dodatkowo Pole nazywamy zmienną składową.

/*
typ nazwaPola;
*/

Zanim uzupełnimy informacje o samochodzie, poznajmy jeden z typów obiektowych dostarczanych przez Javę. (java obiektowość)

String – typ obiektowy, służy do przechowywania ciągów znaków, np.

Więcej o Stringu znajdziesz w dokumentacji Javy.

String marka = "Fiat";

Pamiętaj, aby używać cudzysłowu ” „, a nie apostrofu ’ ’. Apostrof w przypadku znaku (char), cudzysłów w przypadku ciągu znaków (String).

Jak już znamy Stringa, to zdefiniujmy pola w Samochodzie.

class Samochod {
    String marka;
    int rokProdukcji;
    double cena;
}

Metoda

Metoda reprezentuje zachowania obiektu. W metodach często będziemy wykonywali operacje na danych, które są przechowywane w obiekcie.

// deklaracja metody
typ_zwracany nazwa([parametry]){
    [return];
}

// wywołanie metody
nazwa(argumenty);

Deklarując metodę, musimy zastanowić się, czy metoda ma coś zwracać. Jeśli tak, to określ, jakiego będzie typu. Jeśli nie, to ustaw słowo „void”.

Drugim pytaniem, na które musimy odpowiedzieć, to czy metoda potrzebuje jakieś dodatkowe informacje, aby móc się poprawnie wykonać. Czy potrzebujemy jej przekazać dodatkowe parametry ?

Słowo kluczowe return występować będzie w przypadku gdy zdecydujemy się na jakiś typ zwracany, a więc gdy typ zwracany będzie różny od „void”.

// metoda, która nic nie zwraca i nic nie przyjmuje
void przywitaj(){
    System.out.println("Siema");
}

// metoda, która coś zwraca i nic nie przyjmuje
double pensjaJuniora(){
    return 1111.11;
}

// metoda, która coś zwraca i coś przyjmuje
int suma(int a, int b, int c){
    return a+b+c;
}


// przykładowe wywołania metod
przywitaj();
double pensja = pensjaJuniora();
int wynik = suma(1,2,3);

Zadeklarujmy metody potrzebne w Samochodzie.

class Samochod {
    String marka;
    int rokProdukcji;
    double cena;

    void uruchom(){
        System.out.println("Bruuum...");
    }

    void zmienBieg(String nazwa){
        System.out.println("Zmieniam bieg na "+nazwa);
    }

    double cenaPoRabacie(double rabat){
        return cena - (cena * rabat);
    }
}

Dodajmy teraz kilka samochodów i wywołajmy metody.

class Samochod {
    String marka;
    int rokProdukcji;
    double cena;

    void uruchom(){
        System.out.println("Bruummm...");
    }

    void zmienBieg(String nazwa){
        System.out.println("Zmieniam bieg na "+nazwa);
    }

    double cenaPoRabacie(double rabat){
        return cena - (cena * rabat);
    }
}

class Main {
    public static void main(String[] args) {
        Samochod prywatny = new Samochod();
        prywatny.cena = 222.22;
        prywatny.marka = "Ford";

        Samochod sluzbowy = new Samochod();
        sluzbowy.marka = "BMW";
        sluzbowy.rokProdukcji = 1990;

        prywatny.uruchom();

        System.out.println("Jaka jest cena po rabacie 20%? " + prywatny.cenaPoRabacie(0.2));
        System.out.println("Jaka jest cena po rabacie 30%? " + sluzbowy.cenaPoRabacie(0.3));
    }
}

Jeśli chcesz wprowadzić dane z klawiatury, polecam ten artykuł Java Scanner, wprowadzanie danych z klawiatury.

Podsumowanie

W ten sposób udało nam się przerobić wprowadzenie do obiektowości w Javie (java obiektowość). Wiesz już jak stworzyć klasę, zdefiniować w niej pola i metody oraz jak stworzyć instancje klas, czyli obiekty. Teraz czas na Ciebie, wykonaj poniższe zadanie i sprawdź, czy umiesz.


Zadanie polega na stworzeniu klasy, która będzie przechowywać informacje o budynku, takie jak nazwa, rok budowy oraz liczba pięter. Następnie, należy przygotować metodę, która wyświetli wszystkie zgromadzone informacje o danym budynku, oraz metodę, która pozwoli obliczyć aktualny wiek budynku, przyjmując założenie, że rok obecny jest z góry ustalony. Po zdefiniowaniu tej klasy, zadaniem jest stworzenie kilku instancji, reprezentujących różne budynki, przypisanie im odpowiednich wartości, a następnie wywołanie przygotowanych metod dla każdego z nich, aby zademonstrować ich funkcjonalność.

Powodzenia 😀

W razie pytań pisz, chętnie pomogę.