Základy OOP v Javě
Třídy a instance
- Třída - šablona nebo blueprint pro vytváření objektů
- Instance - konkrétní objekt vytvořený podle třídy
- Konstruktor - speciální metoda pro inicializaci objektu
- Klíčové slovo new - vytváří novou instanci
// 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
- Atributy - proměnné uvnitř třídy (stav objektu)
- Metody - funkce uvnitř třídy (chování objektu)
- this - reference na aktuální instanci
- Modifikátory přístupu: public, private, protected
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)
- Jeden ze čtyř pilířů OOP
- Skrývání vnitřní implementace před vnějším světem
- Atributy jsou private, přístup přes veřejné metody
- Zabraňuje přímé manipulaci s daty
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ů
- toString() - vrací textovou reprezentaci objektu
- equals() - porovnává objekty na rovnost
- hashCode() - vrací hash kód objektu
- Všechny třídy dědí od třídy Object
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
- Standardní způsob pro přístup k privátním atributům
- Gettery - vracejí hodnotu atributu
- Settery - nastavují hodnotu atributu
- Umožňují validaci a kontrolu při nastavování hodnot
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)