package gotowe.p10_klasy_podstawy;

// Jeśli klasa zawiera metodę main, to może pełnić rolę programu - można ją uruchamiać (poleceniem java w wierszu poleceń lub z poziomu środowiska deweloperskiego).
class Program {

    public static void main(String[] args) {
        // Deklaracja zmiennej typu obiektowego. Uwaga - sam taki zapis nie tworzy obiektu (inaczej niż w C++).
        Osoba a;
        // System.out.println(a);
        
        // Utworzenie obiektu i wpisanie "referencji do obiektu" do zmiennej:
        a = new Osoba();
        // W nowoutworzonym obiekcie, o ile konstruktor i inicjalizacje w klasie nie wpiszą czegoś innego,
        // pola są inicjowane na wartości 0, false, null w zależności od typu:
        System.out.println(a);
        System.out.println("Początkowe wartości pól: " + a.imie + " " + a.nazwisko + " " + a.wiek);
        // Na polach obiektu (o ile poziom widoczności pozwala) można wykonywać operacje jak na innych zmiennych.
        a.imie = "Ala";
        a.nazwisko = "Kowalska";
        a.wiek = 30;
        System.out.println("a wartości pól: " + a.imie + " " + a.nazwisko + " " + a.wiek);

        // Najczęściej deklaracja zmiennej i utworenie obiektu są zapisane razem:
        Osoba b = new Osoba("Jan", "Kowalski", 30);
        System.out.println(b);
        System.out.println("b wartości pól: " + b.imie + " " + b.nazwisko + " " + b.wiek);
        System.out.println();

        // Wywołania metod na obiektach:
        a.przedstawSie();
        b.przedstawSie();
        if(a.pelnoletnia()) {
            System.out.println(a.imie + " jest pełnoletnia");
        }
        System.out.println();
        System.out.println("Postarzejemy " + b.imie + "...");
        b.postarzejSie();
        a.przedstawSie();
        b.przedstawSie();
    }

}
