Lekcja 7. Obiektowość – klasa, pole, metoda, obiekt

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.

W tym artykule poznamy 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.

Wszystkie artykuły z cyklu “Kurs Java”:


Czego potrzebujesz:

  • zainstalowane JDK (instrukcja)
  • 30 min wolnego czasu

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. Od teraz, 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. Pole nazywamy inaczej zmienną składową.

/*
typ nazwaPola;
*/

Zanim uzupełnimy informacje o samochodzie, poznajmy jeden z typów obiektowych dostarczanych przez Javę.

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

Metody 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("Bruummm...");
    }

    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));
    }
}

Podsumowanie

W ten sposób udało nam się przerobić wprowadzenie do obiektowości w Javie. 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. Stwórz klasę przechowującą informacje o Budynku (nazwa, rok budowy, liczba pięter). Przygotuj metodę wyświetlającą wszystkie informacje o budynku, oraz metodę obliczającą ile lat ma budynek (rok obecny możesz ustawić na sztywno). Stwórz kilka obiektów (budynków), ustaw im wartości i wywołaj dla nich metody.

Powodzenia 😀

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

Subscribe
Powiadom o
guest
3 komentarzy
Oldest
Newest Most Voted
Inline Feedbacks
View all comments
Tomasz
Tomasz
1 rok temu
import java.time.*;

class Budynek {
    String nazwa;
    int ilosc_pieter;
    LocalDate data_budowy;

    public Budynek(String nazwa, int ilosc_pieter, LocalDate data_budowy) {
        this.nazwa = nazwa;
        this.ilosc_pieter = ilosc_pieter;
        this.data_budowy = data_budowy;
    }

    public void setNazwa(String nazwa) {
        this.nazwa = nazwa;
    }

    public long getData_budowy() {
        LocalDate stop = LocalDate.now();
        long ilosc_lat = java.time.temporal.ChronoUnit.YEARS.between(data_budowy, stop);
        return ilosc_lat;
    }

    public void getInfo() {
        System.out.println("Nazwa budynku: " + nazwa);
        System.out.println("ilośc pięter budynku: " + ilosc_pieter);
        System.out.println("wiek budynku: " + getData_budowy() + " lat");
    }
}
Tomasz
Tomasz
1 rok temu
Reply to  Tomasz
import java.time.*;

class Budynek {
    private String nazwaBudynku;
    private int iloscPieter;
    private LocalDate dataBudowy;

    public Budynek(String nazwaBudynku, int iloscPieter, LocalDate dataBudowy) {
        this.nazwaBudynku = nazwaBudynku;
        this.iloscPieter = iloscPieter;
        this.dataBudowy = dataBudowy;
    }

    public void setNazwaBudynku(String nazwaBudynku) {
        this.nazwaBudynku = nazwaBudynku;
    }

    public long getWiekBudynku() { // metoda obliczająca wiek budynku, data wybudowania jest podawana w konstruktorze w formacie yyyy, m, d
        LocalDate obecnyRok = LocalDate.now();
        long ilosc_lat = java.time.temporal.ChronoUnit.YEARS.between(dataBudowy, obecnyRok);
        return ilosc_lat;
    }

    public void getInfo() {
        System.out.println("Nazwa budynku: " + nazwaBudynku);
        System.out.println("ilośc pięter budynku: " + iloscPieter);
        System.out.println("wiek budynku: " + getWiekBudynku() + " lat");
    }

    public static void main(String[] args) {

        Budynek budynek1 = new Budynek("Tower", 12, LocalDate.of(2000,1,1));
        Budynek budynek2 = new Budynek("Stara Szopa ", 3, LocalDate.of(1955,5,1));

        budynek1.getInfo();
        System.out.println();
        budynek2.getInfo();
        budynek2.setNazwaBudynku("Plaza");
        budynek2.getInfo();
        budynek2.getWiekBudynku();
    }
}

Ja wiem, że to zabrzmi śmiesznie ale założenie wykorzystania LocalDate było takie aby wiek budynku zawsze obliczał się zgodnie z bieżącym rokiem. Przerost formy nad treścią? Zapewne, ale mam satysfakcja, że zadziałało coś innego niż metoda na “intach” 🙂