Commit 96d12e94 by Patryk Czarnik

v5 - przygotowanie do private

parent f815a748
package p10_klasy.v5;
public class Konto {
int numer;
int saldo;
Osoba wlasciciel;
Konto(int numer, int saldo, Osoba wlasciciel) {
this.numer = numer;
this.saldo = saldo;
this.wlasciciel = wlasciciel;
}
// można tworzyć więcej konstruktorów, które różnią się liczbą lub typem parametrów
// np. konstruktor tworzący konto z saldem zero:
Konto(int numer, Osoba wlasciciel) {
this(numer, 0, wlasciciel);
}
@Override
public String toString() {
return "Konto nr " + numer + ", " + saldo + " PLN, wł. " + wlasciciel;
}
void wplata(int kwota) {
saldo += kwota;
}
void wyplata(int kwota) {
saldo -= kwota;
}
}
package p10_klasy.v5;
public class Osoba {
String imie, nazwisko;
int wiek;
Osoba() {
}
Osoba(String imie, String nazwisko, int wiek) {
this.imie = imie;
this.nazwisko = nazwisko;
this.wiek = wiek;
}
void przedstawSie() {
System.out.println("Nazywam się " + imie + " " + nazwisko + " i mam " + wiek + " lat.");
}
// final gwarantuje, że żadna podklasa nie będzie mogła nadpisać tej metody
final boolean jestPelnoletnia() {
return wiek >= 18;
}
public String toString() {
return imie + " " + nazwisko + " (" + wiek + " lat)";
}
}
package p10_klasy.v5;
public class Polimorfizm2 {
public static void main(String[] args) {
// Dzięki temu, że "Student jest Osobą" i "Pracownik jest Osobą",
// można obiekty tych klas umieści w tablicy (kolekcji itp.) osób.
Osoba[] osoby = {
new Osoba("Ala", "Kowalska", 44),
new Osoba("Ola", "Malinowska", 13),
new Student("Adam", "Abacki", 20, 1, "medycyna"),
new StudentInformatyki("Karol", "Infobacki", 23, 3),
new Pracownik("Jan", "Kowalski", 40, "kierowca", 3300),
};
// Przeglądają elementy tablicy wiemy na pewno, że są to Osoby,
// ale dodatkowo może się okazać, że niektóre osoby są Student albo Pracownik
// Każda osoba posiada imię, nazwisko i wiek - można te dany odczytać.
// Każda osoba potrafi się przedstawić - można wywołać przedstawSie()
// ale w każdej podklasie ta metoda może mieć inną treść ("overriding").
// Wykona się wersja z właściwej klasy.
for (Osoba osoba : osoby) {
System.out.println("* kolejna osoba to " + osoba.imie + " " + osoba.nazwisko);
System.out.println(" " + osoba);
System.out.print(" ");
// System.out.println(osoba.kierunek); // nie każda osoba jest studentem
osoba.przedstawSie();
System.out.println(" to jest obiekt klasy: " + osoba.getClass().getSimpleName());
// Można jawnie sprawdzić czy zmienna wskazuje na obiekt określonej klasy
// (lub dalszej podklasy - np. StudentInformatyki byłby w tym sensie Studentem)
if(osoba instanceof Student) {
// Jeśli tak jest, to możemy bezpiecznie zrzutować (cast) zmienną na typ Student
Student student = (Student) osoba;
System.out.println(" To jest student kierunku " + student.kierunek
+ ", który ma średnią ocen " + student.sredniaOcen());
}
// natomiast taki if nie byłby prawdziwy dla obiektu klasy StudentInformatyki
if(osoba.getClass() == Student.class) {
System.out.println(" to jest konkretnie klasy Student");
}
System.out.println();
}
}
}
package p10_klasy.v5;
import java.math.BigDecimal;
// W Javie nie ma "wielodziedziczenia", klasa ma dokładnie jedną nadklasę.
public class Pracownik extends Osoba {
private final static int PENSJA_MINIMALNA = 4000;
String zawod;
BigDecimal pensja;
Pracownik() {
}
Pracownik(String imie, String nazwisko, int wiek, String zawod, BigDecimal pensja) {
// wywołanie konstruktora z nadklasy
super(imie, nazwisko, wiek);
this.zawod = zawod;
this.pensja = pensja;
}
Pracownik(String imie, String nazwisko, int wiek, String zawod, double pensja) {
// wywołanie innego konstruktora z tej samej klasy
this(imie, nazwisko, wiek, zawod, BigDecimal.valueOf(pensja).setScale(2));
}
Pracownik(String imie, String nazwisko, int wiek, String zawod, int pensja) {
this(imie, nazwisko, wiek, zawod, BigDecimal.valueOf(pensja).setScale(2));
}
Pracownik(String imie, String nazwisko, int wiek, String zawod, String pensja) {
this(imie, nazwisko, wiek, zawod, new BigDecimal(pensja));
}
Pracownik(String imie, String nazwisko, int wiek, String zawod) {
this(imie, nazwisko, wiek, zawod, PENSJA_MINIMALNA);
}
// tworzenie wielu konstruktorów w tej samej klasie to jest "przeciążanie konstruktorów" / "overloading"
@Override
public void przedstawSie() {
System.out.println("Dzień dobry, tu "+ imie + ", pracuję jako " + zawod + " i zarabiam " + pensja +" zł.");
}
@Override
public String toString() {
return "Pracownik [zawod=" + zawod + ", pensja=" + pensja + ", imie=" + imie + ", nazwisko=" + nazwisko
+ ", wiek=" + wiek + "]";
}
}
package p10_klasy.v5;
public class Przyklad {
public static void main(String[] args) {
Osoba osoba = new Osoba("Ala", "Kowalska", 30);
osoba.przedstawSie();
System.out.println("Imię i nazwisko: " + osoba.imie + " " + osoba.nazwisko);
Student student = new Student("Adam", "Abacki", 21, 2, "medycyna");
student.przedstawSie();
student.dodajOcene(4);
student.dodajOcene(4);
student.dodajOcene(5);
student.oceny.add(100);
System.out.println("Średnia ocen: " + student.sredniaOcen());
Sklep zabka = new Sklep("Żabka", 6);
zabka.sprzedajPiwo(student);
Konto konto1 = new Konto(1, 1000, osoba);
Konto konto2 = new Konto(2, student);
System.out.println(konto1);
System.out.println(konto2);
konto1.wplata(3500);
System.out.println(konto1);
}
}
package p10_klasy.v5;
public class Sklep {
String nazwa;
int cenaPiwa;
int utarg = 0;
Sklep(String nazwa, int cenaPiwa) {
this.nazwa = nazwa;
this.cenaPiwa = cenaPiwa;
}
void sprzedajPiwo(Osoba klient) {
System.out.println("________________");
System.out.println("Klient wchodzi do sklepu " + nazwa + ". Kliencie, przedstaw się...");
klient.przedstawSie();
if(klient.jestPelnoletnia()) {
System.out.println("Osoba " + klient.imie + " kupuje piwo za " + cenaPiwa + " zł");
utarg += cenaPiwa;
} else {
System.out.println("Osoba " + klient.imie + " nie może kupić piwa, bo ma tylko " + klient.wiek + " lat.");
}
System.out.println("^^^^^^^^^^^^^^^");
}
}
package p10_klasy.v5;
import java.util.ArrayList;
import java.util.List;
public class Student extends Osoba {
int rok;
String kierunek;
List<Integer> oceny = new ArrayList<>();
Student() {
}
Student(String imie, String nazwisko, int wiek, int rok, String kierunek) {
super(imie, nazwisko, wiek);
this.rok = rok;
this.kierunek = kierunek;
}
// 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) {
oceny.add(ocena);
}
double sredniaOcen() {
double suma = 0;
for(int ocena : oceny) {
suma += ocena;
}
return suma / oceny.size();
}
// 3) Nadpisać (override) metody, które były zdefiniowane w nadklasie
// czyli dla istniejących metoda podać inną treść.
@Override
void przedstawSie() {
System.out.println("Hej tu "+ imie + " " + nazwisko
+ ", studiuję kierunek " + 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() {
// do tego, co zwraca toString zdefiniowany w klasie Osoba, dodaję info o roku i kierunku studiów:
return super.toString() + ", studiuje na " + rok + " roku kierunku " + kierunek;
}
}
package p10_klasy.v5;
public class StudentInformatyki extends Student {
// Czasami podklasa nie ma nowych pól ani metod,
// a jest wprowadzana po to, aby ustalić pewne szczegóły
// Jest to podklasa / podzbiór w sensie matematycznym (logicznym).
public StudentInformatyki(String imie, String nazwisko, int wiek, int rok) {
// ustalamy, że kierunkiem studiów jest "informatyka" i nie może być inaczej
super(imie, nazwisko, wiek, rok, "informatyka");
}
}
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