OBJEKTINIS PROGRAMAVIMAS

Java klasės metodai

Klasės metodai aprašo objektų veiksmus ir elgseną. Jie gali skaityti arba keisti objekto atributus, priimti parametrus ir grąžinti apskaičiuotas reikšmes.

Kas yra klasės metodas?

Metodas deklaruojamas klasės viduje ir turi pavadinimą, parametrų skliaustus, grąžinamąjį tipą bei kodo bloką. Šis metodas aprašo paprastą knygos atvertimo veiksmą:

public class Knyga {
    void atversti() {
        System.out.println("Knyga atversta");
    }
}
Konsolės rezultato nėra.

Metodas atversti() tik aprašytas, bet niekur neiškviestas. Vien metodo deklaracija jo kodo nepaleidžia.

  1. Metodas deklaruotas klasės Knyga viduje.
  2. void reiškia, kad metodas neatiduoda apskaičiuotos reikšmės.
  3. atversti yra veiksmažodžiu prasidedantis metodo pavadinimas.
  4. Tušti skliaustai () rodo, kad metodui nereikia parametrų.
  5. Kodas tarp riestinių skliaustų bus vykdomas tik tada, kai metodą iškviesime.

Metodo iškvietimas per objektą

Egzemplioriaus metodui iškviesti pirmiausia sukuriamas objektas, o tada naudojamas taško operatorius:

public class Knyga {
    void atversti() {
        System.out.println("Knyga atversta");
    }

    public static void main(String[] args) {
        Knyga knyga = new Knyga();
        knyga.atversti();
    }
}
Konsolės rezultatas

Knyga atversta

  1. Su new Knyga() sukuriamas konkretus knygos objektas.
  2. Kintamasis knyga saugo nuorodą į tą objektą.
  3. Taško operatorius išraiškoje knyga.atversti() pasirenka šio objekto metodą.
  4. Metodas įvykdo savo println() eilutę, todėl konsolėje matome Knyga atversta.

Metodai valdo objekto būseną

Egzemplioriaus metodas tiesiogiai pasiekia to paties objekto atributus:

public class Knyga {
    int perskaitytaPuslapiu = 0;
    boolean baigta = false;

    void perskaitytiDesimtPuslapiu() {
        perskaitytaPuslapiu += 10;

        if (perskaitytaPuslapiu >= 10) {
            baigta = true;
        }
    }

    void rodytiBusena() {
        System.out.println("Perskaityta: " + perskaitytaPuslapiu);
        System.out.println("Baigta: " + baigta);
    }

    public static void main(String[] args) {
        Knyga knyga = new Knyga();
        knyga.perskaitytiDesimtPuslapiu();
        knyga.rodytiBusena();
    }
}
Konsolės rezultatas

Perskaityta: 10
Baigta: true

  1. Naujo objekto atributai pradžioje yra 0 perskaitytų puslapių ir false.
  2. Metodas perskaitytiDesimtPuslapiu() prie atributo prideda 10.
  3. Sąlyga patikrina naują reikšmę. Kadangi ji pasiekė 10, atributas baigta pakeičiamas į true.
  4. Metodas rodytiBusena() perskaito jau pakeistus to paties objekto atributus.
  5. Todėl konsolėje matome 10 ir true.

Klasės metodai su parametrais

Parametrai leidžia tam pačiam objekto metodui atlikti veiksmą su skirtingais duomenimis:

public class Knyga {
    int perskaitytaPuslapiu = 0;

    void skaityti(int puslapiai) {
        perskaitytaPuslapiu += puslapiai;
    }

    public static void main(String[] args) {
        Knyga knyga = new Knyga();
        knyga.skaityti(25);
        knyga.skaityti(15);

        System.out.println(knyga.perskaitytaPuslapiu);
    }
}
Konsolės rezultatas

40

  1. Metodas skaityti() turi parametrą puslapiai.
  2. Pirmas iškvietimas perduoda 25, todėl objekto atributas padidėja nuo 0 iki 25.
  3. Antras iškvietimas perduoda 15 ir prie esamos reikšmės prideda dar 15.
  4. Abu iškvietimai keičia tą patį knyga objektą, todėl gauname 25 + 15 = 40.

Klasės metodai su grąžinamąja reikšme

Vietoje void galima nurodyti rezultato tipą ir grąžinti reikšmę su return:

public class Knyga {
    int perskaitytaPuslapiu = 96;
    int puslapiuSkaicius = 96;

    boolean arBaigta() {
        return perskaitytaPuslapiu >= puslapiuSkaicius;
    }

    public static void main(String[] args) {
        Knyga knyga = new Knyga();
        System.out.println(knyga.arBaigta());
    }
}
Konsolės rezultatas

true

  1. Objektas turi 96 perskaitytus puslapius ir iš viso 96 puslapius.
  2. Metodas arBaigta() palygina šias dvi atributo reikšmes.
  3. Sąlyga 96 >= 96 yra teisinga.
  4. return grąžina loginę reikšmę true.
  5. println() parodo metodo grąžintą rezultatą konsolėje.

Tas pats metodas, skirtingi objektai

Kiekvienas objektas metodą vykdo su savo atributų reikšmėmis:

public class Knyga {
    int perskaitytaPuslapiu = 0;

    void skaityti(int puslapiai) {
        perskaitytaPuslapiu += puslapiai;
    }

    public static void main(String[] args) {
        Knyga pirma = new Knyga();
        Knyga antra = new Knyga();

        pirma.skaityti(20);

        System.out.println("Pirma: " + pirma.perskaitytaPuslapiu);
        System.out.println("Antra: " + antra.perskaitytaPuslapiu);
    }
}
Konsolės rezultatas

Pirma: 20
Antra: 0

  1. Sukuriami du nepriklausomi Knyga objektai.
  2. Abiejų pradinis perskaitytų puslapių skaičius yra 0.
  3. Metodas skaityti(20) iškviečiamas tik per pirmą objektą.
  4. Todėl pirmo objekto atributas tampa 20, o antro objekto atributas lieka 0.
  5. Metodas keičia tik tą objektą, per kurį buvo iškviestas.
Metodas pakeičia tik objektą, per kurį buvo iškviestas.

Pirmos knygos perskaitytų puslapių skaičius padidėja, o antros knygos būsena lieka nepakitusi.

Egzemplioriaus ir static metodai

public class Knyga {
    String pavadinimas = "Mažasis princas";

    void rodytiPavadinima() {
        System.out.println(pavadinimas);
    }

    static void rodytiBiblioteka() {
        System.out.println("Miesto biblioteka");
    }

    public static void main(String[] args) {
        Knyga knyga = new Knyga();
        knyga.rodytiPavadinima();

        Knyga.rodytiBiblioteka();
    }
}
Konsolės rezultatas

Mažasis princas
Miesto biblioteka

  1. rodytiPavadinima() yra egzemplioriaus metodas, nes naudoja konkretaus objekto atributą pavadinimas.
  2. Todėl jis iškviečiamas per objektą: knyga.rodytiPavadinima().
  3. rodytiBiblioteka() pažymėtas static ir nepriklauso vienai konkrečiai knygai.
  4. Jis iškviečiamas per klasės pavadinimą: Knyga.rodytiBiblioteka().
  5. Konsolėje pirmiausia matome konkrečios knygos pavadinimą, o tada bendrą bibliotekos pavadinimą.
Egzemplioriaus ir static metodų skirtumas
Metodo rūšisPriklausoĮprastas iškvietimas
EgzemplioriausKonkrečiam objektuiknyga.rodytiPavadinima()
staticPačiai klaseiKnyga.rodytiBiblioteka()

static metodas tiesiogiai nepasiekia konkretaus objekto egzemplioriaus atributų, nes nėra susietas su vienu objektu.

Aiškių metodų kūrimas

  • Suteik metodui veiksmą nusakantį camelCase pavadinimą.
  • Vienas metodas turėtų turėti vieną aiškią atsakomybę.
  • Objekto būseną keisk tik tada, kai tai atitinka metodo paskirtį.
  • Sudėtingą metodą suskaidyk į mažesnius pagalbinius metodus.
  • Parametrams ir grąžinamoms reikšmėms rinkis tikslius tipus.