OBJEKTINIS PROGRAMAVIMAS

Java klasės atributai

Klasės atributai saugo objekto duomenis ir apibūdina jo būseną. Java kalboje jie taip pat vadinami laukais (angl. fields) arba egzemplioriaus kintamaisiais.

Kas yra klasės atributas?

Atributas deklaruojamas klasės viduje, tačiau už metodų ribų. Kiekvienas iš klasės sukurtas objektas gauna savo egzemplioriaus atributų reikšmes.

public class Knyga {
    String pavadinimas = "Mažasis princas";
    int puslapiuSkaicius = 96;
    boolean perskaityta = false;
}
Konsolės rezultato nėra.

Čia tik aprašyti klasės atributai. Objektas nesukurtas ir nėra println(), todėl niekas nespausdinama.

  1. pavadinimas yra String atributas, todėl saugo tekstą.
  2. puslapiuSkaicius yra int atributas, todėl saugo sveikąjį skaičių.
  3. perskaityta yra boolean atributas, todėl jo reikšmė gali būti tik true arba false.
  4. Visi atributai parašyti klasėje, tačiau už metodų ribų.
  5. Kiekvienas būsimas Knyga objektas gaus savo šių atributų reikšmes.

Atributų pasiekimas

Objekto atributas pasiekiamas taško operatoriumi: objektas.atributas.

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

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

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

Mažasis princas
96

  1. Su new Knyga() sukuriamas konkretus knygos objektas.
  2. Kintamasis knyga leidžia pasiekti būtent šį objektą.
  3. knyga.pavadinimas per tašką pasiekia objekto tekstinį lauką.
  4. knyga.puslapiuSkaicius pasiekia jo skaitinį lauką.
  5. Abi reikšmės parodomos atskirose konsolės eilutėse.

Atributų reikšmių keitimas

Jei atributas nėra nekintamas, jam galima priskirti naują suderinamo tipo reikšmę:

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

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

        knyga.pavadinimas = "Pepė Ilgakojinė";
        knyga.perskaityta = true;

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

Pepė Ilgakojinė
true

  1. Naujas objektas pradžioje turi pavadinimą Mažasis princas ir reikšmę false.
  2. knyga.pavadinimas = "Pepė Ilgakojinė" seną tekstą pakeičia nauju.
  3. knyga.perskaityta = true pažymi, kad knyga jau perskaityta.
  4. println() parodo jau pakeistas, o ne pradines reikšmes.
  5. Pakeitimai priklauso šiam konkrečiam knyga objektui.

Kiekvienas objektas turi savo būseną

Pagal tą pačią klasę sukurti objektai gali saugoti skirtingas atributų reikšmes:

public class Knyga {
    String pavadinimas;
    int puslapiuSkaicius;

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

        pirma.pavadinimas = "Mažasis princas";
        pirma.puslapiuSkaicius = 96;

        antra.pavadinimas = "Pepė Ilgakojinė";
        antra.puslapiuSkaicius = 160;

        System.out.println(pirma.pavadinimas + ": " + pirma.puslapiuSkaicius);
        System.out.println(antra.pavadinimas + ": " + antra.puslapiuSkaicius);
    }
}
Konsolės rezultatas

Mažasis princas: 96
Pepė Ilgakojinė: 160

  1. Pagal tą pačią Knyga klasę sukuriami du atskiri objektai.
  2. Pirmam objektui priskiriamas vienas pavadinimas ir 96 puslapiai.
  3. Antram objektui priskiriamas kitas pavadinimas ir 160 puslapių.
  4. Kiekvienas objektas turi savo atskiras laukų reikšmes.
  5. Todėl konsolėje matome dvi skirtingas knygas ir jų puslapių skaičius.
pirma ir antra yra nepriklausomi objektai.

Pakeitus vienos knygos pavadinimą ar puslapių skaičių, kitos knygos duomenys nepasikeičia.

Nekintamas atributas su final

final neleidžia atributui dar kartą priskirti kitos reikšmės:

public class Knyga {
    final String isbn = "978-609-01-0000-0";

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

        knyga.isbn = "978-609-01-1111-1";
    }
}
Kompiliatoriaus rezultatas

error: cannot assign a value to final variable isbn

  1. Atributas isbn pažymėtas raktažodžiu final.
  2. Pradinė ISBN reikšmė jam suteikiama deklaravimo metu.
  3. Sukūrus objektą bandoma tam pačiam atributui priskirti kitą tekstą.
  4. Java neleidžia pakeisti final reikšmės, todėl programa nesukompiliuojama.
  5. ISBN yra tinkamas nekintamo atributo pavyzdys, nes konkretaus knygos leidimo numeris neturėtų keistis.

Atributas ir vietinis kintamasis

public class Knyga {
    String pavadinimas = "Mažasis princas"; // Klasės atributas

    void skaityti() {
        int skaitymoTrukme = 20; // Vietinis kintamasis
        System.out.println(pavadinimas + ": " + skaitymoTrukme + " minučių");
    }

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

Mažasis princas: 20 minučių

  1. pavadinimas deklaruotas klasėje už metodų ribų, todėl jis yra atributas.
  2. Šį atributą turi konkretus Knyga objektas.
  3. skaitymoTrukme sukuriamas metodo skaityti() viduje, todėl jis yra vietinis kintamasis.
  4. Vietinis kintamasis egzistuoja tik tol, kol vykdomas šis metodo iškvietimas.
  5. Metodas sujungia objekto atributą ir vietinę reikšmę į vieną konsolės eilutę.
Klasės atributo ir vietinio kintamojo skirtumas
SavybėKlasės atributasVietinis kintamasis
DeklaruojamasKlasėje, už metodų ribųMetodo arba kodo bloko viduje
PriklausoObjekto būsenaiKonkrečiam metodo vykdymui
PasiekiamasPagal prieigos taisykles klasės metoduose ar per objektąTik deklaravimo bloke
Numatytoji reikšmėSuteikiama automatiškaiPrieš naudojimą reikia inicializuoti

Atributų apsauga

Šiuose pradiniuose pavyzdžiuose atributai pasiekiami tiesiogiai. Praktinėse objektinėse programose jie dažnai žymimi private, o reikšmės valdomos per metodus. Tai vadinama .