---
# System prepended metadata

title: Inheritance

---

# Inheritance

Mechanizm pozwalający na wpółdzielenie funcjonalności między 

Klasy bazowe (superclass) oraz klasy pochodne (subclass)

Każda klasa może rozszerzać inną klase (w javie 11, w najnowszych wersjach javy dodano sealed classes), ale tylko jedną.

// zagadać o to jakie realne przykłady, co kojarzą z poprzednich projektów


Przykład z klasą Vehicle i Car

```java=
public class Vehicle {

    private int wheelsNumber;

    public Vehicle(int wheelsNumber) {
        this.wheelsNumber = wheelsNumber;
    }

    public void goForward() {
        System.out.println("Going forward");
    }
}

public class Bicycle extends Vehicle {

    public Bicycle() {
        super(2);
    }

    @Override
    public void goForward() {
        System.out.println("Pedal the bicycle");
        super.goForward();
    }
}

public class Car extends Vehicle {

    private int fuelLiters;

    public Car(int fuelLiters) {
        super(4);
        this.fuelLiters = fuelLiters;
    }

    public void start() {
        System.out.println("Turning car ignition");
        if (fuelLiters == 0) {
            throw new IllegalStateException("No fuel to start car");
        }

        System.out.println("Started car");
    }

    @Override
    public void goForward() {
        System.out.println("Press gas pedal");
        super.goForward();
    }
}

public class Main {

    public static void main(String[] args) {
        Vehicle vehicle = new Vehicle(3);
        vehicle.goForward();


        Car car = new Car(2);
        car.start();
        car.goForward();
    }
}
```

- [ ] konstruktory bezargumentowe i argumentowe
- [ ] super
- [ ] override metody
- [ ] dziedziczenie z object
- [ ] `toString` `hashcode`

Zadanie kodowania - Geometry Klasa shape, circle, rectangle, square metoda Area 

Zaprezentować diamond problem czyli czemu można rozszerzać tylko jedną klasę


# Polymorphism, encapsulation (polimorfizm i hermetyzacja/enkapsulacja)

Polimorfizm jest to zdolność obiektu do przybierania wielu form. Pozwala na wykoanie tych samych akcji na różne sposoby bez wiedzy o ich implementacji

- [ ] zaprojektowanie biblioteki

Klasa `Library` `Book` -> `HardCoverBook`, `SoftCoverBook` (hardcover ma np Bookmark ze zaznaczoną jakąś stroną) 

```java=
public class Library {

    private Book[] shelf;
    private int index = -1;

    public Library(int size) {
        shelf = new Book[size];
    }

    public void addBook(Book book) {
        index++;
        shelf[index] = book;
    }

    public Book getBook(int index) {
        if (index >= 0 && index <= this.index) {
            return shelf[index];
        }

        throw new IllegalArgumentException("There is no book on shelf in position: " + index);
    }

}
```

- [ ] w mainie wywołanie addBook, getBook i castowanie (instanceof)
- [ ] task wymyslcie sami jakis przykład ze mamy jakas wpólną funkcje i te klasy nadpisują i jakies wykorzystanie tego typu nadrzednego

## Dodatkowo warto omówić przed uml


- [ ] enum
- [ ] pakietowanie - idea i jak
- [ ] List - ArrayList i LinkedList