("Sakam apgut JAVA's · Web viewJava klase – objektu šablons Java klases...

Post on 14-Mar-2018

242 views 16 download

Transcript of ("Sakam apgut JAVA's · Web viewJava klase – objektu šablons Java klases...

Java klase – objektu šablons

Java klases eksemplāri - objekti

Katram objektam ir sekojošas īpašības:

1) stāvoklis – objekta datu vērtības;

2) uzvedība (behavior) – ko ar objektu var darīt (izmantot datus un metodes);

3) identitāte – katra objekta unikalitāte (dati var būt vienādi, bet divi objekti tomēr ir atšķirīgi).

Java klaseJava klases objekts

Java klases objektsJava klases objekts

1

Java klases objektos pieeja datiem iespējama tikai izmantojot klases metodes – tā ir datu iekapsulēšana (encapsulation)

Pieejas tipi klases datiem un metodēm:

1) private – nevar izmantot no citām klasēm;

2) public – var izmantot arī no citām klasēm;

3) protected – apakšklašu metodēm ir tieša pieeja superklases datiem.

Java klase

Metode A Metode B

Datu vienība

2

Mainīgo tipi un konsoles izvadsMainīgo tipi:1) veselie skaitļi: byte, short, int, long;2) reālie skaitļi: double, float;3) simboli: char;4) loģiskie jeb būla mainīgie: boolean (vērtības: true, false).

class Piemers1 {public static void main (String args[]) { // Galvenā metode, ar to sākas izpilde.int i1, i2, i3;i1 =1; Rezultāts:i2 = 2;i3 = i1 +i2;System.out.println("Summa = " + i3); } }

Alternatīvi pieraksta varianti:class Piemers1 {public static void main (String args[]) {int i1=1, i2=2, i3;i3 = i1 +i2;System.out.println("Summa = " + i3); } }

class Piemers1 {public static void main (String args[]) {int i1=1, i2=2, i3;System.out.println("Summa = " + (i1 + i2)); } }

class Piemers2 {public static void main (String args[]) { Rezultāts:char simb1, simb2, simb3, simb4;simb1 = 'Y';simb2 = 88; // Simbola kodssimb3 = simb2;simb3++; // Simbola koda palielināšanasimb4 = simb1;simb4++;System.out.println(simb1 + " " + simb2 + " " + simb3+ " " + simb4); } }

3

Vienkāršo mainīgo definēšana un sākotnējo vērtību piešķiršanapublic class Piemers3 {public static void main (String[ ] args) {char simb_main_16 = 'A';byte vesals_main_8 = 127;short vesals_main_16 = 32767;int vesals_main_32 = 2147483647;long vesals_main_64 = 922337203;float real_main_32 = 3.40282347E+38F;double real_main_64 = 1.7976931348623157E+38F;boolean loģiskais_main = true;System.out.println(simb_main_16); } }

Mainīgā vērtības palielināšana vai samazināšana par 1 vienību

int i = 2;i =i+1; // i = 3i++; // i = 3++i; // i = 3i--; // i = 2--i; // i = 2int n = 3;int m = 2 * ++n; // n = 4, m = 8 Vispirms izmaina vērtību, tad sarēķinaint m = 2 * n++; // n = 4, m = 6 Vispirms sarēķina, tad izmaina vērtību

Konstantes (vērtības nevar tikt mainītas)static final double p = 3.1416;

Komentāri

........................// Vienas rindas komentārs/* Vairāku rindu komentāri *//** Komentāri dokumentu veidošanai*/

4

Masīvi

class Piemers3 {public static void main (String args[]) {int masivs1[];masivs1 = new int[10];masivs1[0] = 0;masivs1[9] = 9;System.out.println(masivs1[0] + " " + masivs1[9]); } }

Alternatīva masīva definēšanas forma:class Piemers3 {public static void main (String args[]) {int[] masivs = new int[10];masivs1[0] = 0;masivs1[9] = 9;System.out.println(masivs1[0] + " " + masivs1[9]); } }

Divdimensiju masīva veidošana:class Piemers4 {public static void main (String args[]) {int masivs2[] [] =new int [5] [5];int i, j, k = 0;for (i =0; i <5; i++) { for (j=0; j<5; j++){ masivs2[i][j]=k; k++; System.out.print(masivs2[i][j] + " ");} System.out.println(); } } }

int [] masivs3 = {1, 2, 3, 4, 5};

int skaits = 10;int {} masivs4 = new int[skaits];

5

Simbolu rindas mainīgo definēšana izmantojot klasi String

import java.math.*;public class Tests{public static void main(String[] args){ String x = "ABCDE";int y = x.length(); // y vērtība ir 5System.out.println("Simbolu skaits = " + y);String z = x.substring(0, 3); // rezultāts ir "ABC"String r = x.substring(0, 3) + z + 'G'; // rezultāts ir "ABCABCG"System.out.println("z = " + z + ";" + "r = " + r); boolean m = z.equals (r); // simbolu rindu vienādības pārbaudeSystem.out.println("Salidzinajums = " + m); }}

6

Salīdzināšanas un loģikas darbības

Salīdzināšanas darbības:1) vienāds == ;2) nevienāds != ;3) lielāks > ;4) mazāks < ;5) lielāks vienāds >= ;6) mazāks vienāds <= .

Loģikas darbības:1) un (and) & ;2) vai (or) | ;3) izslēdzošais vai (xor) ^ ;4) nē (not) ! .

Nosacījuma operatori

if (alga >= 1000) {nodokli = 300;}else if (alga >= 500) {nodokli = 100;}else (nodokli = 0;}

switch (tips) { // tips vērtība var būt 5, 6 vai cita case 5: ... break; case 6: ... break; default: ... break; }

7

while un for cikli

while (nosacījums) {operatori};

while (nosacījums) {operatori; if (nosacījums) break; // Izeja no cikla operatori;}while (nosacījums) {operatori; if (nosacījums) continuebreak; // Turpinājums, ja izpildās operatori;}

for (int i = 1; i <= 10; i++) {operatori};

for (Cilveks masivs : a) System.out.println(a);

8

Rezultāta tipa norādīšana

import java.math.*;public class Tests{public static void main(String[] args){ double x = 10.2;int y ;y = (int) Math.round(x);System.out.println("y = " + y); }}

9

Īpašo situāciju apstrāde (exception handling)

try {Programmas kods, kurā ipašās situācijas tiek uztvertas} catch (īpašās situācijas tips e) {Īpašās situācijas apstrādes komandas} finally {Programmas kods, izpildās beigās vienmēr}

The term exception is shorthand for the phrase "exceptional event." Definition: An exception is an event, which occurs during the execution of a program, that disrupts the normal flow of the program's instructions. When an error occurs within a method, the method creates an object and hands it off to the runtime system. The object, called an exception object, contains information about the error, including its type and the state of the program when the error occurred. Creating an exception object and handing it to the runtime system is called throwing an exception.After a method throws an exception, the runtime system attempts to find something to handle it. The set of possible "somethings" to handle the exception is the ordered list of methods that had been called to get to the method where the error occurred. The list of methods is known as the call stack (see the next figure).

The runtime system searches the call stack for a method that contains a block of code that can handle the exception. This block of code is called an exception handler. The search begins with the method in which the error occurred and proceeds through the call stack in the reverse order in which the methods were called. When an appropriate handler is found, the runtime system passes the exception to the handler. An exception handler is considered appropriate if the type of the exception object thrown matches the type that can be handled by the handler.The exception handler chosen is said to catch the exception. If the runtime system exhaustively searches all the methods on the call stack without finding an appropriate exception handler, as shown in the next figure, the runtime system (and, consequently, the program) terminates.

10

Īpašās situācijas

Programmas izpildes laikā var rasties īpasas situācijas, kurāsjāizpilda noteiktas darbības. Īpašās situācijas veido:

1) kļūdas programmās;2) situācijas, kuru apstrādei nepieciešams papildus programmas kods.

Ir:1) iebūvētās īpašās situācijas (ArithmeticException,

IllegalArgumentException, ...);2) programmētāja definētās īpašās situācijas.

Īpašo situāciju apstrādei izmanto slēgvārdus:1) try {bloks, kurā tiek izskatītas īpašās situācijas}2) catch (īpašās_situācijas_tips) {īpašās situācijas apstrāde}

class PiemersTryCatch {public static void main (String args[] ) {int d, a;try {d = 0; a = 42/d; System.out.println( a); }catch (ArithmeticException e) {System.out.println("Kļuda! Dalisana ar nulli.");}

System.out.println("Turpinājums!"); }}

3) throw Savas īpašās situācijas izveidošana4) throws Uzskaita īpašās situācijas, kuras tiek pārtvertas5) finally {komandu bloks, kurš tiek izpildīts pēc bloka try/catch izpildes}

11

Klases definējums

public class KlasesNosaukums {

datu_lauks_1 // lauks (field)datu_lauks_2 // lauks (field). . .konstruktors_1konstruktors_2. . .metode_1metode_2. . . }

Piemērs:

public class KlaseA { public static void main (String[ ] args) { System.out.println ("Sakam apgut JAVA's tehnologijas. "); } }

12

Klases definēšanas noteikumi

1. Tiek ņemts vērā vai izmantots lielais vai mazais burts (main vai Main).

2. public (access modifier) – citas klases var izmantot vai citas metodes var

izmantot.

3. Klases nosaukums sākas ar lielo burtu (Klase_A).

4. Faila nosaukumam ar klases definējumu un klases nosaukumam ir jābūt

vienādiem.

5. Faila paplašinājums ir .java.

6. Kompilators izveido failu ar klases nosaukumu un paplašinājumu .class.

7. Klases izpilde sākas ar metodi main.

8. Tiek izmantots pieraksts objekts.metode(parametri).

13

Vienkārša klase

class Cilveks {public int PersKods;public String Uzvards;public String Vards;public static String Valsts = "Latvija"; }

// Konstruktora metode - konstruktors

Cilveks (int CilvPersKods, String CilvUzvards, String CilvVards) {PersKods = CilvPersKods;Uzvards = CilvUzvards;Vards = CilvVards; }

// Metode

public String UzvVar() {String main_1 = "Tukšs";if (Uzvards != null) main_1 = Uzvards + Vards;return main_1; }

14

Konstruktors jeb konstruktora metode

1. konstruktora variantsclass Kaste {//Klases mainīgiedouble platums;double augstums;double biezums;// KonstruktorsKaste(duble p, double a, double b) {platums = p;augstums = a;biezums = b;}// Metodeduble Tilpums () { return platums*augstums*biezums;} }

2. konstruktora variantsclass Kaste {//Klases mainīgiedouble platums;double augstums;double biezums;// KonstruktorsKaste(duble platums, double augstums, double biezums) {this.platums = platums;this.augstums = augstums;this. biezums = biezums;}// Metodeduble Tilpums () { return platums*augstums*biezums;} }

3. konstruktora variantsclass Kaste {//Klases mainīgiedouble platums;double augstums;double biezums;// Konstruktors definē objektu sākotnējās vērtības. // Visi klases objekti sākumā ir vienādiKaste(duble p, double a, double b) {platums = 10;augstums = 10;biezums = 10;}// Metodeduble Tilpums () { return platums*augstums*biezums;} }

15

Klases definēšanas piemērspublic class Darbinieks {// klases eksemplāra atribūti private String uzvards; private double alga; private int dzim_gads; // konstruktor-funkcija public Darbinieks (String uzv, double alg, int gads) { uzvards = uzv; alga = alg; dzim_gads = gads; } // metodes public String getUzvards() { return uzvards; } public double getAlga() { return alga; } public int getDzim_gads() { return dzim_gads; } public void Algas_maina (double procents) { double pieaugums = alga * procents /100; alga += pieaugums; } }

public class DarbinieksTests { public static void main (String [] args) { Darbinieks [] darbinieki = new Darbinieks [3]; darbinieki [0] = new Darbinieks ("Koks", 400.50, 1980); darbinieki [1] = new Darbinieks ("Celms", 500.50, 1985); darbinieki [2] = new Darbinieks ("Sakne", 550.50, 1970); for (Darbinieks e : darbinieki) System.out.println("uzvards= "+ e.getUzvards() + ", alga= " +

e.getAlga() ); } }

16

Klases objekta (klases eksemplāra) izveidošanaclass Punkts { public double x, y; }

Punkts mainPunkts = new Punkts();mainPunkts.x = 123.5;mainPunkts.y = 456.5;

Klases mainīgie (visai klasei viena un tā pati mainīgā vērtība)public static Punkts Obj_punkts = new Punkts;

Metodespublic void clear() { x = 0; y =0; } // Metodei nav parametru un tā neatgriež // nekādu vērtību (tāpēc tips – void) public double attālums(Punkts p_punkts) { double xx, yy; xx = x – p_punkts.x; yy = this.y – p_punkts.y; return Math.sqrt(xx * xx + yy * yy); }double mai_punkts = a_punkts.attālums(b_punkts); // Metodes izsaukums

Klases jeb statiskās metodes (strādā tikai ar klases mainīgiem jeb atribūtiem)

17

Saites starp objektiem

1. Saite – "lieto" (dependence, uses-a).

2. Saite – agregācija (B var eksistēt bez A).

3. Saite – kompozīcija (B nevar eksistēt bez A).

4. Saite - mantošana (inheritance, is-a).

Objektu klase A Objektu klase B

Objektu klase A Objektu klase B

Objektu klase A Objektu klase B

Objektu klase A Objektu klase B

18

Klašu piemēri

1. Klases Cilveks definējums. Galvenās metodes (main) definējumā nav.

public class Cilveks{// Klases mainīgieprivate String vards;private String uzvards;//Konstruktora funkcijapublic Cilveks(String a, String b) {vards = a; uzvards = b;}//Metodespublic String getVards() {return vards;}public String getUzvards() {return uzvards;}public void setVards(String x) {vards = x;}public void setUzvards(String y) {uzvards = y;} }

2. Klases CilveksTests definējums. Definējumā ir galvenā (main) metode.Divu klases Cilveks eksemplāru datu ierakstīšana masīvā masivs[]

public class CilveksTests{public static void main(String[] args){ Cilveks masivs[] = new Cilveks[2];masivs[0] = new Cilveks("Juris", "Koks");masivs[1] = new Cilveks("Rasma", "Zars");// Masīva masivs[] datu izvadeSystem.out.println("masiva[] dati:");for (Cilveks c : masivs)

System.out.println(c.getVards()+" " + c.getUzvards()); } }

3. Rezultāts:

Klases Cilveks definējumsvardsuzvardsgetVards()getUzvards()setVards()setUzvards()

Masīvs masivs[]Juris KoksRasma Zars

19

Juris KoksJuris

RasmaJurisZarsKoksJuris

RasmaJurisZarsKoksJuris

Juris KoksJuris

4. Klases CilveksTests definējums. Definējumā ir galvenā (main) metode.Divu klases Cilveks objektu izveidošana un to datu izvadepublic class CilveksTests{Cilveks Obj1, Obj2;Obj1 = new Cilveks("Juris", "Koks");Obj2 = new Cilveks("Rasma", "Zars");// Objekta datu izvadeSystem.out.println("Objekta Obj1 dati:");System.out.println(Obj1.getVards() + " " + Obj1.getUzvards());System.out.println("Objekta Obj2 dati:");System.out.println(Obj2.getVards() + " " + Obj2.getUzvards()); }}

5. Rezultāts:

6. Divu klases Cilveks objektu izveidošana, datu ievade izmantojot set metodes un izvade.

public class CilveksTests{public static void main(String[] args){ //Divu klases Cilveks objektu izveidošanaCilveks Obj1, Obj2;Obj1 = new Cilveks("n", "n");Obj2 = new Cilveks("n", "n");// Metožu izmantošana datu ievadeiSystem.out.println("Metožu izmantošana:");Obj1.setVards("Juris");Obj1.setUzvards("Koks");Obj2.setVards("Rasma");Obj2.setUzvards("Zars");// Objektu datu izvadeSystem.out.println("Objekta Obj1 dati:");System.out.println(Obj1.getVards() + " " + Obj1.getUzvards());System.out.println("Objekta Obj2 dati:");System.out.println(Obj2.getVards() + " " + Obj2.getUzvards()); }}

7. Rezultāts:

20

Objekta tipa mainīgo definēšana

public class CilveksTests{public static void main(String[] args){ //Objekta mainīgā izveidošana un tā inicializēšanaCilveks objekts; // Klases Cilveks objekta mainīgā objekts izveidošanaobjekts = new Cilveks("Zane", "Sakne"); /* Objekta piesaiste objekta mainīgajam */System.out.println("Objekta dati:");System.out.println(objekts.getVards()+ " " + objekts.getUzvards());}}

public class CilveksTests{public static void main(String[] args){ /*Objekta mainīgā izveidošana, tā inicializēšana piesaistot tam jaunizveidotu objektu */Cilveks objekts = new Cilveks("Zane", "Sakne"); System.out.println("Objekta dati:");System.out.println(objekts.getVards()+ " " + objekts.getUzvards());}}

public class CilveksTests{public static void main(String[] args){ /* Objekta mainīgā izveidošana, tā inicializēšana piesaistot tam jaunizveidotu tukšu objektu un objekta datu ievade izmantojot Set metodes */Cilveks objekts = new Cilveks("n", "n"); objekts.setVards("Inese");objekts.setUzvards("Liepa");System.out.println("Objekta dati:");System.out.println(objekts.getVards()+ " " + objekts.getUzvards());}}

21

Klašu paketes

package pakete_1;class Klase_1 { ... }

22

Datu ievade

import java.io.*;class Ievade {public static void main(String args[]) throws IOException{char c;BufferedReader br = new BufferedReader(new InputStreamReader(System.in));System.out.println("Ievadiet simbolus! Lai pabeigtu, nospiediet 'q'.");do {c = (char) br.read();System.out.println(c);}while (c != 'q'); }}

Rezultāts:Ievadiet simbolus! Lai pabeigtu, nospiediet 'q'.a <Enter>ab <Enter>bq <Enter>qProcess completed.

23

Mantošana 1. Bāzes klase jeb galvenā klase jeb vecāku klase jeb superklase

package JAVA_.client;import java.util.*; // Eksistējošo programmu pakešu piesaistīšana. public class Cilveks { private String pers_kods; // Atribūti jeb lauki private String vards; private String uzvards; private double pamatalga; // Konstruktors public Cilveks(){} public Cilveks(String a_pers_kods, String a_vards, String a_uzvards, double a_pamatalga) { this.pers_kods = a_pers_kods; this.vards = a_vards; this.uzvards = a_uzvards; this. pamatalga = a_pamatalga; } // Metodes public String getPers_kods() { return pers_kods;} public String getVards() { return vards;} public String getUzvards() { return uzvards;} public double getAlga() { return pamatalga; } }

2. Pakārtotā klase jeb meitas klase

package JAVA_.client;import java.util.*; // Eksistējošo programmu pakešu piesaistīšana. public class Galdnieks extends Cilveks { private double piemaksa; public Galdnieks (String a_pers_kods, String a_vards, String a_uzvards, double a_pamatalga, double a_piemaksa) { super (a_pers_kods, a_vards, a_uzvards, a_pamatalga); this.piemaksa = a_piemaksa; }public double getPiemaksa ( ) { return piemaksa ;} public double getAlga() { return super.getAlga() + piemaksa;} }

klase Cilveks

pakārtotā klase Galdnieks

metode getAlga()

metode getAlga()

24

3. Klases CilveksTests un GaldnieksTests

package JAVA_.client;import java.util.*;public class CilveksTests{ public static void main (String [] args) { Cilveks [] cilveki = new Cilveks [3]; cilveki [0] = new Cilveks ("210650-12345", "Juris", "Koks", 400.50); cilveki [1] = new Cilveks ("110980-23456", "Rasma", "Celms", 500.50); cilveki [2] = new Cilveks ("300475-45678", "Liene", "Sakne", 550.50); for (Cilveks d : cilveki) System.out.println("uzvards= "+ d.getUzvards() + ", pamatalga = " + d.getAlga() );} }

uzvards= Koks, pamatalga= 400.5uzvards= Celms, pamatalga= 500.5uzvards= Sakne, pamatalga= 550.5

package JAVA_.client;import java.util.*;public class GaldnieksTests{ public static void main (String [] args) { Galdnieks [] galdnieki = new Galdnieks [3]; galdnieki [0] = new Galdnieks ("210650-12345", "Juris", "Koks", 400.50, 100.00); galdnieki [1] = new Galdnieks ("110980-23456", "Rasma", "Celms", 500.50, 100.00); galdnieki [2] = new Galdnieks ("300475-45678", "Liene", "Sakne", 550.50, 100.00); for (Galdnieks d : galdnieki) System.out.println("uzvards= "+ d.getUzvards() + ", pamatalga ar piemaksu = " + d.getAlga() );} }

uzvards= Koks, pamatalga ar piemaksu = 500.5uzvards= Celms, pamatalga ar piemaksu = 600.5uzvards= Sakne, pamatalga ar piemaksu = 650.5

25

1. Klase CilveksGaldnieksTests

package JAVA_.client;import java.util.*;public class CilveksGaldnieksTests{ public static void main (String [] args) { Galdnieks [] galdnieki = new Galdnieks [3]; galdnieki [0] = new Galdnieks ("210650-12345", "Juris", "Koks", 400.50, 100.00); galdnieki [1] = new Galdnieks ("110980-23456", "Rasma", "Celms", 500.50, 100.00); galdnieki [2] = new Galdnieks ("300475-45678", "Liene", "Sakne", 550.50, 100.00); for (Galdnieks d : galdnieki) System.out.println("uzvards= "+ d.getUzvards() + ", pamatalga ar piemaksu = " + d.getAlga() ); for (Cilveks d : cilveki) System.out.println("uzvards= "+ d.getUzvards() + ", pamatalga = " + d.getAlga() );} }

uzvards= Koks, pamatalga ar piemaksu = 500.5uzvards= Celms, pamatalga ar piemaksu = 600.5uzvards= Sakne, pamatalga ar piemaksu = 650.5uzvards= Koks, pamatalga = 500.5uzvards= Celms, pamatalga = 600.5uzvards= Sakne, pamatalga = 650.5

26

package JAVA_.client;import java.util.*;public class CilveksGaldnieksTests{ public static void main (String [] args) { Galdnieks [] galdnieki = new Galdnieks [3]; galdnieki [0] = new Galdnieks ("210650-12345", "Juris", "Koks", 400.50, 100.00); galdnieki [1] = new Galdnieks ("110980-23456", "Rasma", "Celms", 500.50, 100.00); galdnieki [2] = new Galdnieks ("300475-45678", "Liene", "Sakne", 550.50, 100.00); for (Galdnieks d : galdnieki) System.out.println("uzvards= "+ d.getUzvards() + ", pamatalga ar piemaksu = " + d.getAlga() ); Cilveks [] cilveki = new Cilveks [3]; cilveki [0] = galdnieki [0]; cilveki [1] = galdnieki [1]; cilveki [2] = galdnieki [2]; for (Cilveks d : cilveki) System.out.println("uzvards= "+ d.getUzvards() + ", pamatalga = " + d.getAlga() );} }

uzvards= Koks, pamatalga ar piemaksu = 500.5uzvards= Celms, pamatalga ar piemaksu = 600.5uzvards= Sakne, pamatalga ar piemaksu = 650.5uzvards= Koks, pamatalga = 500.5uzvards= Celms, pamatalga = 600.5uzvards= Sakne, pamatalga = 650.5

27

Klases paplašināšana ar klasi

class Attr { private String name; Klases atribūti private Object value = null; public Attr(String nameOf) Konstruktori { name = nameOf; } public Attr(String nameOf, Object valueOf) { name = nameOf; value = valueOf; } public String nameOf() { return name; } Metodes public Object valueOf() { return value; } public Object valueOf(Object newValue) { Object oldVal = value; value = newValue; return oldVal; } }

class ColorAttr extends Attr { private ScreenColor myColor; // преобразованный цветpublic ColorAttr(String name, Object value) Konstruktori { super(name, value); decodeColor(); } // Superklases konstruktora izsaukšanapublic ColorAttr(String name) {this(name, “transparent”); } // Šīs klases konstr.izsaukšanapublic ColorAttr(String name, ScreenColor value) { super(name, value.toString()); myColor = value; }public Object valueOf(Object newValue) {// сначала выполнить метод valueOf() суперклассаObject retval = super.valueOf(newValue);decodeColor();return retval; }/** Присвоить атрибуту ScreenColor значение, а не описание */public ScreenColor valueOf(ScreenColor newValue) {// сначала выполнить метод valueOf() суперклассаsuper.valueOf(newValue.toString());myColor = newValue;return newValue; }/** Вернуть преобразованный объект ScreenColor */public ScreenColor color() {return myColor; }/** Задать ScreenColor по описанию в valueOf */protected void decodeColor() {if (valueOf() == null) myColor = null;elsemyColor = new ScreenColor(valueOf()); } }

SuperklaseObject

SuperklaseAttr

Pakārtotā klaseColorAttr

28