Metody objektů

Třída Automobil

Třída Automobil obsahuje jedinou metodu info(), která nemá žádné parametry, ani nevrací žádnou hodnotu (návratový typ void).

  
class Automobil {
// -------------------- členské proměnné --------------------
  public String nazev;
  public double spotreba;
  public double palivo;
  public int najeto;
  
// ---------------------- konstruktory ----------------------  
  public Automobil(String nazev, double spotreba) {          
    this.nazev = nazev;
    this.spotreba = spotreba;  
    palivo = 0;  
    najeto = 0;
  }  
// ------------------------- metody -------------------------  
  public void info() {                                       
    System.out.println("Aktualni udaje vozu " + this.nazev );
    System.out.println("Spotreba: "+ this.spotreba +" litru na 100 km");
    System.out.println("Stav paliva: "+ this.palivo +" litru");
    System.out.println("Najeto: "+ this.najeto +" km");
    System.out.println("------------------------------------------");
  }
}

Třída TestAutomobil

Třída TestAutomobil slouží k tomu, abychom si mohli vyzkoušet, jak se vytvářejí instance třídy Automobil, jak můžeme přistupovat k členským proměnným těchto instancí a jak volat metodu info() pro tyto instance.

public class TestAutomobil {    
  public static void main(String[] args) {
    Automobil Fabia = new Automobil("Fabia", 5.3);    // volání konstruktorů
    Automobil Octavia = new Automobil("Octavia", 7.2);
 
    Fabia.palivo = 25;                 // přímý přístup k členským proměnným
    Octavia.palivo = 30;

    Fabia.najeto = 150;
    Octavia.najeto = -800;             // přiřazení nesmyslné hodnoty

    Fabia.info();                      // volaní metod
    Octavia.info(); 
  }
}

Přístupová práva

Třída Automobil

V předchozí ukázce jsme členské proměnné třídy Automobil deklarovali s přístupovými právy public (veřejný). Tím jsme umožnili přímý přístup k těmto proměnným i jiných třídám. Ve třídě TestAutomobil jsme tak mohli přímo nastavit hodnoty proměnných palivo a najeto. To je sice pohodlné, ale nepříliš bezpečné, neboť můžeme nastavit nesmyslnou (zápornou) hodnotu počtu najetých kilometrů. Důležitou zásadou objektového programování je, že každá třída by si měla své členské proměnné chránit před přímým přístupem z jiných tříd. V definici třídy Automobil proto změňte přístupová práva na private (soukromý).

  
// -------------------- členské proměnné --------------------
  private String nazev;
  private double spotreba;
  private double palivo;
  private int najeto;

Nyní již třída TestAutomobil nemůže přímo přistupovat k členským proměnným třídy Automobil (vyzkoušejte!). Umožníme jí ale k nim přistupovat nepřímo, prostřednictvím vhodných metod třídy Automobil. Kód následujích metod doplňte na správné místo do definice třídy Automobil. Všimněte si, jak si obě metody samy hlídají hodnoty zadaných parametrů a provádí potřebné výpočty.

  
// ------------------------- metody -------------------------
  public void natankuj(double palivo) {
    if (palivo > 0) {
      this.palivo += palivo;
    }  
  }
  
  public void popojed(double vzdalenost) {
    if (vzdalenost > 0) {
      najeto += vzdalenost;
      palivo -= (vzdalenost/100)*spotreba;
    }  
  }

Třída TestAutomobil

Ve třídě TestAutomobil nahradíme přímý přístup k členským proměnným třídy Automobil (který už teď není možný) nepřímým přístupem - voláním metod natankuj() a popojed().

public class TestAutomobil {        
  public static void main(String[] args) {
    Automobil Fabia = new Automobil("Fabia", 5.3);    // volání konstruktorů
    Automobil Octavia = new Automobil("Octavia", 7.2);
 
    Fabia.natankuj(25);                    // volání metod
    Octavia.natankuj(30);

    Fabia.popojed(100);    
    Octavia.popojed(-8000);                // nesmyslnou hodnotu parametru metoda správně ošetří
    Fabia.popojed(50);

    Fabia.info();
    Octavia.info(); 
  }
}

Cvičení

  1. Doplňte do třídy Automobil metodu vynuluj(), která umožní vynulování počtu ujetých kilometrů libovolného vozu.
  2. Přidejte do definice třídy Automobil další členskou proměnnou velikostNadrze.
  3. Upravte konstruktor v definici třídy Automobil tak, aby umožňoval zadat kromě názvu vozu a spotřeby i velikost nádrže vozu.
  4. Upravte kód metody natankuj() tak, aby nebylo možno natankovat více litrů benzínu, než kolik se vejde do nádrže.
  5. Upravte kód metody popojed() tak, aby nebylo možno ujet více kilometrů, než na kolik má vůz palivo.
  6. Podívejte se na video tutoriál Public a private a potom si zkuste definici třídy Pes sami napsat a vyzkoušejte si její metody.