Klasy cd.

Jeśli tworzymy nową klasę, musimy ją zainicjować (zapoczątkować, wprowadzić) . W tym celu wpisujemy:

public class Main {

    public static void main(String[] args) {
   Car porsche = new Car ();
    }
}

powyżej stworzyliśmy nowy typ danych o nazwie porsche (rodzaj samochodu). Innymi słowy stworzyliśmy obiekt porsche, bazując na szablonie (klasie) Car. Możemy dodać kolejny obiekt na podstawie klasy Car :

public class Main {

    public static void main(String[] args) {
        Car porsche = new Car ();
        Car holden = new Car();
}
}

Wpisując następnie „porsche.” pojawia nam się okno z metodami dostępnymi dla tego obiektu. Wyświetlane są one automatycznie  z tzw. klasy podstawowej (bazowej) Javy zawsze wtedy, gdy tworzymy nowy obiekt. Możemy dodać nowe elementy. Jednak nie widać wśród nich komponentów (zmiennych), które wcześniej utworzyliśmy ( drzwi, koła, model itd).

14.06.2

Żeby mieć do nich dostęp należy wejść w klasę Car i zmienić modyfikator dostępu z „private” na „public”, by mogły być pola z klasy Car widoczne w innych klasach ( w tym przypadku w klasie Main):

package com.wordpress.programujeodzera;

public class Car {
    public int doors;
    public int wheels;
    public String models;
    public String engine;
    public String colour;

}

wówczas, jeśli przejdziemy ponownie do klasy Main i ponownie wpisujemy „porsche.” to pojawia nam się lista metod („m) i pól („f”), które wcześniej utworzyliśmy w klasie Car.14.06.3

Następnie dla obiektu porsche określamy pole model jako typ Carrera

package com.wordpress.programujeodzera;

public class Main {

    public static void main(String[] args) {
        Car porsche = new Car ();
        Car holden = new Car();
        porsche.model = "Carrera";
        
}
}

Teraz spróbujmy utworzyć metodę w klasie Car, która będzie dotyczyć wszystkich obiektów wewnątrz tej klasy. Chcemy sprawić, by metoda miała możliwość modernizacji (aktualizacji) modelu. Zmieniamy wszystkie pola w klasie Car na private i tworzymy metodę, wpisując:

public void setModel (void – ponieważ metoda ta nie zwraca danych)

kiedy zaczynamy wpisywać „set….” Intellij automatycznie podpowiada nam nasze zmienne do zmodernizowania, które wcześniej utworzyliśmy w klasie Car:

15.06.1

następnie wprowadzamy parametr:

String- ponieważ chcemy, aby inna klasa wysłała ciąg znaków (słowo), jaki chcę utworzyć i żeby była uaktualniona tutaj w klasie Car. Pojawia się tutaj inny problem, ponieważ mamy dwa różne typy zmiennych. Jest pole zdefiniowane w klasie Car i nazwane model oraz mamy też parametr „model” w naszej metodzie. Musimy być precyzyjni, który typ chcemy zmodernizować. W tym celu posłuży nam nowe keyword: „this„, kiedy odnosimy się do pola w tej klasie Car:

package com.wordpress.programujeodzera;

public class Car {
    private int doors;
    private int wheels;
    private String model;
    private String engine;
    private String colour;

    public void setModel(String model){
        this.model = model;
    }

}

Jeśli wrócimy teraz do klasy Main, zauważymy błąd, ponieważ zmieniliśmy wcześniej modyfikator public na private:

15.06.2

jeśli chcielibyśmy zaktualizować „model”, wpisujemy:

package com.wordpress.programujeodzera;

public class Main {

    public static void main(String[] args) {
        Car porsche = new Car ();
        Car holden = new Car();
        porsche.setModel("Carrera");

}
}

powyższy kod przywołuje metodę setModel (tzw. setter) dla naszego obiektu i aktualizuje go przypisując mu model Carrera. Jeśli uruchomimy powyższy kod, w oknie konsoli nic się nie pojawi.

Sprawdźmy co się stanie, gdy będziemy mieli zdefiniowaną zmienną Car porsche, ale nie zainicjujemy jej. Intelijj podkreśla na czerwono w kodzie porsche. – i informuje nas, że ta zmienna nie została zainicjowana:15.06.3

dlatego należy pamiętać, żeby zainicjować zmienną przy użyciu keyword „new”. Jeśli np. wpiszemy keyword „null”, jak poniżej:

package com.wordpress.programujeodzera;

public class Main {

    public static void main(String[] args) {
        Car porsche = new Car ();
        Car holden = new Car();
        porsche = null;
        porsche.setModel("Carrera");

}
}

wówczas w oknie konsoli wyświetli się nam:

15.06.4

NullPointerException – znaczy, że zdefiniowaliśmy typ : porsche, ale nie został on zainicjowany. Innymi słowy, nie stworzyliśmy obiektu z szablonu, który dotyczy klasy. Dlatego należy pamiętać, żeby słowo „new” zostało użyte.

Sprawmy teraz, żeby w konsoli coś się wyświetliło po uruchomieniu kodu.

Wracamy do naszej klasy Car. Utworzymy tzw. getter, będący metodą umożliwiającą pobranie jakichś wartości:

wpisując kod return this.m… wyświetlają nam się podpowiedzi Intellij:15.06.5 oznacznik „f” oznacza field czyli pole, m- method czyli metodę, kłódka otwarta oznacza, że dana zmienna bądź metoda jest z modyfikatorem dostępu public (dostępna dla innych klas), a jeśli jest zamknięta – wtedy jest z modyfikatorem dostępu private.

package com.wordpress.programujeodzera;

public class Car {
    private int doors;
    private int wheels;
    private String model;
    private String engine;
    private String colour;

    public void setModel(String model){
        this.model = model;
    }
    public String getModel (){
        return this.model;
    }

wytłuszczonym drukiem powyżej mamy metodę, która odwołuje się do innego miejsca, żeby został zwrócony model samochodu. Następnie otwieramy klasę Main i dopisujemy:

package com.wordpress.programujeodzera;

public class Main {

    public static void main(String[] args) {
        Car porsche = new Car ();
        Car holden = new Car();
        porsche.setModel("Carrera");
        System.out.println("Model is " + porsche.getModel());

}
}

w oknie konsoli wyświetli się Model is Carrera:

15.06.6

jeśli wpiszemy kod:

System.out.println("Model is " + porsche.getModel());

przed ustawieniem modelu Carrera:

public class Main {

    public static void main(String[] args) {
        Car porsche = new Car ();
        Car holden = new Car();
        System.out.println("Model is " + porsche.getModel());
        porsche.setModel("Carrera");
        System.out.println("Model is " + porsche.getModel());

}
}

wówczas w oknie konsoli:

15.06.7

w oknie konsoli pojawiło się również „Model is null”. „Null” jest wewnętrzną wartością domyślną dla klas i dla ciągu znaków (String). Jeśli teraz wrócimy do naszej klasy Car zauważymy, że String jest tak naprawdę klasą. Tak więc mamy klasę String wewnątrz klasy Car. Tak samo model, silnik i kolor są klasami samymi w sobie ponieważ są typu String i są umieszczone w klasie o nazwie Car.

Dzięki użyciu settera setModel w klasie Car możemy ustawić prawidłowość – ang. validation.

Zapoczątkujmy test, który pozwoli nam zaakceptować tylko wartości będące porsche carrera i holden commodore dla tej metody:

package com.wordpress.programujeodzera;

public class Car {
    private int doors;
    private int wheels;
    private String model;
    private String engine;
    private String colour;

    public void setModel(String model){
        String validModel = model.toLowerCase();
        if(validModel.equals("carrera")||validModel.equals("commodore")){
            this.model = model;}
            else{this.model = "Unknown";}

    }
    public String getModel (){
        return this.model;
    }

}

jeśli teraz otworzymy klasę Main i uruchomimy kod, pojawi się w konsoli:

16.06.1

jeśli zaś w klasie Main wpiszemy w miejscu setModel inny model samochodu porsche, np. 911:

package com.wordpress.programujeodzera;

public class Main {

    public static void main(String[] args) {
        Car porsche = new Car ();
        Car holden = new Car();

        porsche.setModel("911");
        System.out.println("Model is " + porsche.getModel());

}
}

w oknie konsoli pojawi się zdanie mówiące, że model ten jest nieznany (unknown):

16.06.2

dzieje się tak, ponieważ w naszej klasie Car określiliśmy prawidłowość (walidację) – ustawiliśmy w metodzie setModel, że prawidłowy model (validModel) samochód ma być albo marki porsche carrera albo holden commodore.