Commit fbc746c7 by Patryk Czarnik

polimorfizm1

parent 06f09b9f
package p11_klasy.podstawy;
public class Polimorfizm1 {
public static void main(String[] args) {
Osoba osoba = new Osoba("Ala", "Kowalska", 30);
Student student = new Student("Adam", "Abacki", 22, "geologia", 2);
System.out.println(osoba);
osoba.przedstawSie();
System.out.println();
System.out.println(student);
student.przedstawSie();
System.out.println();
// Nawet, gdy zmienna jest typu Osoba, ale w tej zmiennej jest referencja do obiektu klasy Student,
// to przy wywołaniu metody wykona się wersja z klasy Student.
// W mechanizmie override decydujące znaczenie ma typ obiektu w czasie wykonania.
Osoba ktos;
ktos = osoba;
ktos.przedstawSie();
ktos = student;
ktos.przedstawSie();
System.out.println();
Sklep sklep = new Sklep("Lidl", 6);
sklep.sprzedajPiwo(osoba);
sklep.sprzedajPiwo(student);
}
}
...@@ -18,6 +18,14 @@ public class Student extends Osoba { ...@@ -18,6 +18,14 @@ public class Student extends Osoba {
this.rok = rok; this.rok = rok;
} }
// Jeśli chodzi o metody, podklasa może
// 1) Nie zmieniać metod odziedziczonych z nadklasy
// przykład: jestPelnoletnia()
// Taka metoda w nadklasie może być zadeklarowana jako "final" - to znaczy,
// że jest to ostateczna definicja i podklasa nie może jeje zmienić
// 2) Dodać nowe metody, których nie było w nadklasie
void dodajOcene(int ocena) { void dodajOcene(int ocena) {
oceny.add(ocena); oceny.add(ocena);
} }
...@@ -28,5 +36,21 @@ public class Student extends Osoba { ...@@ -28,5 +36,21 @@ public class Student extends Osoba {
.average() .average()
.orElse(0); .orElse(0);
} }
// 3) Nadpisać (override) metody, które były zdefiniowane w nadklasie
// czyli dla istniejących metoda podać inną treść.
void przedstawSie() {
System.out.println("Hej tu " + imie + " " + nazwisko + ", studiuję " + kierunek + ", jestem na " + rok + " roku");
}
// Od Javy 5 przed definicją metody, która nadpisuje definicję z nadklasy, można umieścić adnotację @Override
// Ważne: nawet bez tej adnotacji nadpisanie jest skuteczne. Adnotacja tylko:
// - zwiększa czytelność kodu ("rzuca się w oczy")
// - powoduje błąd kompilacji, gdyby okazało się, że jednak tutaj nie nadpisujemy metody, tylko definiujemy nową (np. literówka w nazwie, parametry innego typu)
@Override
public String toString() {
return super.toString() + ", student " + rok + " roku kierunku " + kierunek;
}
} }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment