Tahák - Objektově-orientované programování v Javě

Základy OOP v Javě

Třídy a instance

// Definice třídy public class Auto { // Atributy (vlastnosti) private String znacka; private int rokVyroby; // Konstruktor public Auto(String znacka, int rokVyroby) { this.znacka = znacka; this.rokVyroby = rokVyroby; } // Metody (chování) public void zatrub() { System.out.println("HONK HONK!"); } } // Vytvoření instance Auto mojeAuto = new Auto("Škoda", 2020); mojeAuto.zatrub(); // Volání metody

Atributy a metody

public class Student { // Atributy private String jmeno; private int vek; // Metody public void nastavJmeno(String jmeno) { this.jmeno = jmeno; // this rozlišuje atribut od parametru } public String vratJmeno() { return this.jmeno; } public void pozdrav() { System.out.println("Ahoj, já jsem " + jmeno); } }

Zapouzdření (Encapsulation)

public class BankovniUcet { private double zustatek; // Kontrolovaný přístup přes metody public void vlozPenize(double castka) { if (castka > 0) { this.zustatek += castka; } } public boolean vyberPenize(double castka) { if (castka > 0 && castka <= this.zustatek) { this.zustatek -= castka; return true; } return false; } public double getZustatek() { return this.zustatek; } }

Základní metody objektů

public class Osoba { private String jmeno; private int vek; @Override public String toString() { return "Osoba{jmeno='" + jmeno + "', vek=" + vek + "}"; } @Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null || getClass() != obj.getClass()) return false; Osoba osoba = (Osoba) obj; return vek == osoba.vek && jmeno.equals(osoba.jmeno); } @Override public int hashCode() { return Objects.hash(jmeno, vek); } } // Použití Osoba osoba = new Osoba("Jan", 25); System.out.println(osoba.toString()); // Osoba{jmeno='Jan', vek=25}

Dědičnost a polymorfismus

Dědičnost (Inheritance): Třída může dědit od jiné třídy
Polymorfismus: Schopnost objektu mít různé formy
// Nadřazená třída (rodič) public class Zvire { protected String jmeno; public Zvire(String jmeno) { this.jmeno = jmeno; } public void zvuk() { System.out.println("Zvire vydava zvuk"); } } // Podtřída (dítě) - dědí od Zvire public class Pes extends Zvire { public Pes(String jmeno) { super(jmeno); // Volání konstruktoru rodiče } @Override public void zvuk() { System.out.println(jmeno + " steka: Haf haf!"); } // Specifická metoda pouze pro Psa public void aport() { System.out.println(jmeno + " aportuje!"); } } // Polymorfismus Zvire mojeZvire = new Pes("Rex"); mojeZvire.zvuk(); // Rex steka: Haf haf! // mojeZvire.aport(); // Chyba - metoda není v Zvire

Gettery a Settery

public class Uzivatel { private String jmeno; private int vek; private String email; // Gettery public String getJmeno() { return jmeno; } public int getVek() { return vek; } public String getEmail() { return email; } // Settery s validací public void setJmeno(String jmeno) { if (jmeno != null && !jmeno.trim().isEmpty()) { this.jmeno = jmeno; } } public void setVek(int vek) { if (vek >= 0 && vek <= 150) { this.vek = vek; } } public void setEmail(String email) { if (email != null && email.contains("@")) { this.email = email; } } }

4 pilíře OOP

Pilíř Popis Příklad v Javě
Zapouzdření
(Encapsulation)
Skrývání implementačních detailů Privátní atributy + veřejné gettery/settery
Dědičnost
(Inheritance)
Předávání vlastností z rodiče na potomka extends keyword, super
Polymorfismus
(Polymorphism)
Schopnost mít různé formy Přetěžování metod, překrývání metod (@Override)
Abstrakce
(Abstraction)
Skrývání komplexnosti Abstraktní třídy, rozhraní (interface)

Modifikátory přístupu

Modifikátor Viditelnost Použití
public Všude Veřejné rozhraní třídy
private Pouze uvnitř třídy Interní implementace
protected Třída + podtřídy + stejný balíček Pro dědičnost
(žádný - default) Pouze stejný balíček Balíčková viditelnost

Klíčová slova OOP v Javě

public abstract class Tvar { // abstract - nelze instancovat protected String barva; // protected - viditelné pro potomky public abstract double obsah(); // abstraktní metoda - musí být implementována public static int pocetInstanci; // static - patří třídě, ne instancím public final String NAZEV = "Tvar"; // final - konstantní hodnota } public class Ctverec extends Tvar { // extends - dědičnost private double strana; public Ctverec(double strana) { this.strana = strana; pocetInstanci++; // přístup ke statické proměnné } @Override // @Override - překrývání metody public double obsah() { return strana * strana; } }
Tip pro kvíz:
• Pamatujte si rozdíl mezi extends (dědičnost tříd) a implements (implementace rozhraní)
this odkazuje na aktuální instanci, super na rodiče
• Abstraktní třídy mohou mít implementované metody, rozhraní nemohou (až do Java 8)