Java programming

Post on 20-Oct-2015

37 views 5 download

description

slideshow for java programming

Transcript of Java programming

Programavimas JAVA

doc. dr. L.Pupeikienė

Paveldėjimas

Paveldėjimo ribos Paveldėjimas – klasės gebėjimas paveldėti

protėvių klasės duomenis ir metodus (kaip vaikas paveldi iš tėvo).

Visos klasės yra java.long.Object klasės vaikai, todėl jos paveldi visus šios klasės metodus.

Tėvo klasė paprastai apima visas pagrindines savybes ir charakteristikas, kurios yra bendros visoms būsimoms vaikų klasėms.

Taigi visą uždavinio esmę lemia tėvo klasė.

Paveldėjimo ribos Vaikas paveldi visus matomus (ne private) tėvo k Sprendžiant uždavinį visus tėvo klasės metodus galima

papildyti savais metodais vaiko klasėje, kintamuosius ir metodus.

Tai vadinama vienos krypties paveldėjimu (tėvo klasės objektams nauji vaiko kintamieji ir metodai tėvo klasei nepasiekiami).

final klasės paveldėti negalima. Klasių, metodų ir kintamųjų varduose galima naudoti

tik lotyniškas raides. Pageidautina išvedamuosiuose į ekraną komentaruose taip pat vartoti tik lotyniškas raides (t.y. rašyti šveplai).

Paveldėjimo schemos Klasės Figura vaikai: Apskritimas, Kvadratas, Trikampis. Jie

paveldi tėvo klasės Figura bendrus metodus: piešti(), trinti(), gautiSpalva(), keistiSpalva().

Šiuo atveju visos trys vaiko klasės naudojasi tik tėvo klasės metodais.

Figura

piesti()trinti()gautiSpalva()keistiSpalva()

Apskritimas Kvadratas Trikampis

Paveldėjimo schemos Plačiai naudojamos tokios schemos:1. Vaiko klasė tik pasikeičia jai nevisai tinkančius (sukurtų algoritmų požiūriu) tėvo klasės metodus. Tai vadinama metodų

užklotimi.2. Vaiko klasė turi nuosavus metodus, kurių jei trūksta naudojant tėvo klasės metodus.3. Mišrus variantas: naudojama metodų užklotis ir pridedami nuosavi metodai. Korektiškiausias yra pirmasis variantas, nes vaikas išsaugo tėvo klasės interface ir niekada nekyla “vienos krypties papildymo

problemų”.

Paveldėjimo schemos Mišri schema:

Klasės Apskritimas ir Kvadratas jau naudoja naujas piesti() ir trinti() metodų modifikacijas. Klasė Trikampis turi tik jai vienai pasiekiamą metodą uzpildyti(). Tai vienos krypties metodas. O trynimui naudos tėvo klasės metodą.

Figura

piesti()trinti()gautiSpalva()keistiSpalva()

Apskritimas

piesti()trinti()

Kvadratas

piesti()trinti()

Trikampis

piesti()uzpildyti()

Paveldėjimo aprašas Tėvo tipo objektui galima priskirti vaiko tipo

objektą (tėvas žino viską apie savo vaiką). Vaiko tipo objektui negalima priskirti tėvo tipo

objekto (vaikas nežino visko apie savo tėvą). Paveldėjimas išreiškiamas sukuriant objektus; Paveldėjimo klasės antraštė pasipildo žodeliu

extends:

[modifikatorius] class VaikoVardas extends TevoKlasesVardas

Pavyzdys 1class B { public int sumavimas(int y, int x)

{ System.out.println("x+y="+(x+y));return (x+y);}

}class A extends B { public int daugyba(int x, int y)

{ System.out.println("x*y="+(x*y));return (x*y);}

}class testas { static A a = new A(); static B b = new B();

public static void main(String[] args) { int x=5, y=20, sum, dgs;

sum = a.sumavimas(x, y);dgs = a.daugyba(sum, x);System.out.println("daugyba "+a.daugyba(sum, dgs));b=a;b.sumavimas(sum, dgs);System.out.println("daugyba "+b.sumavimas(dgs, sum));

}}

class B { public int sumavimas(int y, int x)

{ System.out.println("x+y="+(x+y));return (x+y);}

}class A extends B { public int daugyba(int x, int y)

{ System.out.println("x*y="+(x*y));return (x*y);}

}class testas { static A a = new A(); static B b = new B();

public static void main(String[] args) { int x=5, y=20, sum, dgs;

sum = a.sumavimas(x, y);dgs = a.daugyba(sum, x);System.out.println("daugyba "+a.daugyba(sum, dgs));b=a;b.sumavimas(sum, dgs);System.out.println("daugyba "+b.sumavimas(dgs, sum));

}} Koks bus atsakymas ?

Pavyzdys 1

x+y=25x*y=125x*y=3125daugyba 3125x+y=150x+y=150daugyba 150

x+y=25x*y=125x*y=3125daugyba 3125x+y=150x+y=150daugyba 150

Pavyzdys 2class Class1 { private String s = "Class1: ";

public void append(String ss) { s += ss; }public void m1() { append(" m1()");}public void m2() { append(" m2()");}public void m3() { append(" m3()");}public void print() { System.out.println(s+";");}public static void main(String[] args) { Class1 c1 = new Class1();

c1.m1(); c1.m2(); c1.m3(); c1.print();}}public class testas extends Class1 { public void m3()

{ append(“ Class2.m3()");}

public void m4() { append(" m4()"); } public static void main(String[] args) { testas c2 = new testas();

c2.m1(); c2.m2(); c2.m3(); c2.m4(); c2.print();System.out.println("Test for the superclass Class1:");Class1.main(args);}

}

class Class1 { private String s = "Class1: ";

public void append(String ss) { s += ss; }public void m1() { append(" m1()");}public void m2() { append(" m2()");}public void m3() { append(" m3()");}public void print() { System.out.println(s+";");}public static void main(String[] args) { Class1 c1 = new Class1();

c1.m1(); c1.m2(); c1.m3(); c1.print();}}public class testas extends Class1 { public void m3()

{ append(“ Class2.m3()");}

public void m4() { append(" m4()"); } public static void main(String[] args) { testas c2 = new testas();

c2.m1(); c2.m2(); c2.m3(); c2.m4(); c2.print();System.out.println("Test for the superclass Class1:");Class1.main(args);}

}

Koks bus atsakymas ?

Pavyzdys 2

Class1: m1() m2() Class2.m3() m4();Test for the superclass Class1:Class1: m1() m2() m3();

Class1: m1() m2() Class2.m3() m4();Test for the superclass Class1:Class1: m1() m2() m3();

Konstruktoriai ir atributas super Taigi konstruktoriaus vieta yra skirta

paruošiamiesiems veiksmams su naujai sukurtu objektu atlikti.

Sukūrus vaiko klasės objektą, jo viduje savaime yra sukuriamas ir tėvo klasės objektas.

Tokiu atveju tėvo objektas turi būti korektiškai inicijuojamas.

Taigi JAVA pati išsikviečia tėvo konstruktorių iš vaiko konstruktoriaus.

Pavyzdysclass A{ A()

{System.out.println("Vykde A() konstruktoriu");}}

class B extends A{ B()

{System.out.println("Vykde B() konstruktoriu");}}

class C extends B{ C()

{System.out.println("Vykde C() konstruktoriu");}}

class testas{ public static void main(String[] args)

{ C c = new C();}}

class A{ A()

{System.out.println("Vykde A() konstruktoriu");}}

class B extends A{ B()

{System.out.println("Vykde B() konstruktoriu");}}

class C extends B{ C()

{System.out.println("Vykde C() konstruktoriu");}}

class testas{ public static void main(String[] args)

{ C c = new C();}}

Koks bus atsakymas ?

Pavyzdys

Vykde A() konstruktoriuVykde B() konstruktoriuVykde C() konstruktoriu

Vykde A() konstruktoriuVykde B() konstruktoriuVykde C() konstruktoriu

SVARBU! Jei naudojami savi konstruktoriai, kompiliatorius

tėvo ir vaiko klasei sukurs ir iškvies “bevardžius” konstruktorius.

Konstruktorius pradedamas vykdyti nuo aukščiausios klasės ir eina žemyn pagal hierarchiją (nuo tėvo klasės atgal iki vaiko klasės).

Atributas super Jei konstruktorius yra su parametrų sąrašu, tada

pačiam reikia iškviesti tėvo klasės konstruktorių.

Tam naudojamas žodelis super. Prie šio parametro skliausteliuose nurodomi

perduodami parametrai.

class B1 extends A1{ B1(int i)

{super(i);// kiti veiksmai ir metodai

}}

class B1 extends A1{ B1(int i)

{super(i);// kiti veiksmai ir metodai

}}

Pavyzdysclass A1{ A1(int i){System.out.println("Konstruktorius A1(): i^5 = "+Math.round(Math.pow(i, 5)));}}class B1 extends A1{ B1(int i)

{ super(i);System.out.println("Konstruktorius B1(): i(saknis) = "+(int)(Math.sqrt(i)));}}

class C1 extends B1{ C1(int i)

{ super(i);System.out.println("Konstruktorius C1(): i = "+i);}

}class testas{ public static void main(String[] args)

{ int i = 25;C1 c = new C1(i);}

}

class A1{ A1(int i){System.out.println("Konstruktorius A1(): i^5 = "+Math.round(Math.pow(i, 5)));}}class B1 extends A1{ B1(int i)

{ super(i);System.out.println("Konstruktorius B1(): i(saknis) = "+(int)(Math.sqrt(i)));}}

class C1 extends B1{ C1(int i)

{ super(i);System.out.println("Konstruktorius C1(): i = "+i);}

}class testas{ public static void main(String[] args)

{ int i = 25;C1 c = new C1(i);}

}

Koks bus atsakymas ?

Pavyzdys

Konstruktorius A1(): i^5 = 9765625Konstruktorius B1(): i(saknis) = 5Konstruktorius C1(): i = 25

Konstruktorius A1(): i^5 = 9765625Konstruktorius B1(): i(saknis) = 5Konstruktorius C1(): i = 25

Svarbu Jeigu klasėje C1() praleistume kontruktoriaus

iškvietimą – klaida! Jei konstruktoriaus iškvietimą praleistume B1()

klasėje – klaida! Būtina, kad sakinys super eitų pirmuoju sakiniu; super dar vadinamas kreipiniu į tėvo klasės

kintamąjį/metodą (kai sutampa vardai.

super formatai:super.kintamasissuper.metodas()

Pavyzdys 1class A1{ int x=3;}class B1 extends A1{int x=4;}class C1 extends B1{ int x=5;

{ A1 a = new A1();System.out.println("x = "+ x);System.out.println("kvadratas = "+Math.pow(this.x, 2));System.out.println("x = "+(super.x));System.out.println("saknis = "+Math.sqrt(super.x));System.out.println("x = "+(a.x));System.out.println("sandauga = "+(super.x*a.x));

}}class testas extends C1{ public static void main(String[] args)

{ C1 c = new C1(); System.out.println("---------"); }

}

class A1{ int x=3;}class B1 extends A1{int x=4;}class C1 extends B1{ int x=5;

{ A1 a = new A1();System.out.println("x = "+ x);System.out.println("kvadratas = "+Math.pow(this.x, 2));System.out.println("x = "+(super.x));System.out.println("saknis = "+Math.sqrt(super.x));System.out.println("x = "+(a.x));System.out.println("sandauga = "+(super.x*a.x));

}}class testas extends C1{ public static void main(String[] args)

{ C1 c = new C1(); System.out.println("---------"); }

}

Koks bus atsakymas ?

Pavyzdys 1

x = 5kvadratas = 25.0x = 4saknis = 2.0x = 3sandauga = 12---------

x = 5kvadratas = 25.0x = 4saknis = 2.0x = 3sandauga = 12---------

Pavyzdys 2class Class3 { Class3(int i)

{System.out.println("Constructor of Class3 "+i);}}class Class4 extends Class3 { Class4(int i)

{ super(i); i++; System.out.println("Constructor of Class4 " +i);}

}public class testas extends Class4 { testas(int i)

{ super(i);i = i+2;System.out.println("Constructor of testas " +i);}

public static void main (String[] args) { testas c5 = new testas(123);}}

class Class3 { Class3(int i)

{System.out.println("Constructor of Class3 "+i);}}class Class4 extends Class3 { Class4(int i)

{ super(i); i++; System.out.println("Constructor of Class4 " +i);}

}public class testas extends Class4 { testas(int i)

{ super(i);i = i+2;System.out.println("Constructor of testas " +i);}

public static void main (String[] args) { testas c5 = new testas(123);}}

Koks bus atsakymas ?

Pavyzdys 2

Constructor of Class3 123Constructor of Class4 124Constructor of testas 125

Constructor of Class3 123Constructor of Class4 124Constructor of testas 125

Klausimai ?

Metodų užklotis (overriding)

Tai – polimorfizmo atvejis, kai vaiko klasėse naudojami vienodi metodai.

Būtinos sąlygos: Sutampa metodų vardai; Sutampa jų antraštės; Sutampa metodų grąžinamos reikšmės tipai.

Metodo pasirinkimą nusako tipas objekto, kuriam šis metodas kviečiamas.

Metodų užklotis (overriding)

T.y. jei objektas yra tėvo klasės tipo, tai bus kviečiamas jos metodas. Kitu atveju kviečiamas vaiko klasės metodas.

Tai atlieka vykdymo metu ir vadinama “dinaminiu suliejimu”.

Tačiau tai prailgina programos vykdymo trukmę. Neužklojami:

Konstruktoriai; final tipo metodai; statiniai metodai (statinį metodą galima “paslėpti” tik

statiniu metodu).

Pavyzdysclass Figura{ protected double ilgis;

protected double plotis;Figura()//------------------------------------------{ this(0.0, 0.0);}

Figura(double i, double j) {ilgis = i; plotis = j;}

double plotas()//-----------------------------------{System.out.print("ploto nera -> ");return -1;}

double plotas(double ilgis, double plotis){System.out.print("ploto su parametrais nera -> ");return -2;}

double perimetras(){System.out.print("perimetro nera -> ");return -3;}

}

class Figura{ protected double ilgis;

protected double plotis;Figura()//------------------------------------------{ this(0.0, 0.0);}

Figura(double i, double j) {ilgis = i; plotis = j;}

double plotas()//-----------------------------------{System.out.print("ploto nera -> ");return -1;}

double plotas(double ilgis, double plotis){System.out.print("ploto su parametrais nera -> ");return -2;}

double perimetras(){System.out.print("perimetro nera -> ");return -3;}

}

class Staciakampis extends Figura{ Staciakampis()

{super(); }Staciakampis(double a, double b) {super (a, b);}double plotas()//-----------------------------------

{System.out.println("Staciakampis:");return ilgis*plotis;}

double plotas(double ilgis, double plotis){System.out.print("Staciakampio plotas = ");return (ilgis*plotis);}

double perimetras(){System.out.print("Staciakampio perimetras = ");return ilgis*2+plotis*2;} }

class StatusisTrikampis extends Figura{ StatusisTrikampis()

{super(); }StatusisTrikampis(double a, double b)

{ilgis = a; plotis = b;}double plotas()//-----------------------------------

{System.out.println("Statusis trikampis:");return ilgis*plotis;}

double plotas(double ilgis, double plotis){System.out.print(" Stataus trikampio plotas = ");return (ilgis*plotis)/2;}

double perimetras(){return ilgis+plotis+Math.sqrt(ilgis*ilgis+plotis*plotis);} }

class Staciakampis extends Figura{ Staciakampis()

{super(); }Staciakampis(double a, double b) {super (a, b);}double plotas()//-----------------------------------

{System.out.println("Staciakampis:");return ilgis*plotis;}

double plotas(double ilgis, double plotis){System.out.print("Staciakampio plotas = ");return (ilgis*plotis);}

double perimetras(){System.out.print("Staciakampio perimetras = ");return ilgis*2+plotis*2;} }

class StatusisTrikampis extends Figura{ StatusisTrikampis()

{super(); }StatusisTrikampis(double a, double b)

{ilgis = a; plotis = b;}double plotas()//-----------------------------------

{System.out.println("Statusis trikampis:");return ilgis*plotis;}

double plotas(double ilgis, double plotis){System.out.print(" Stataus trikampio plotas = ");return (ilgis*plotis)/2;}

double perimetras(){return ilgis+plotis+Math.sqrt(ilgis*ilgis+plotis*plotis);} }

class skaiciuoti{ skaiciuoti()

{super();}double skaiciuoti(Figura f, double x, double y)

{System.out.println(" Plotas = "+(int)f.plotas());System.out.println(" Perimetras = "+(int)f.perimetras());System.out.println(" Plotas = "+(int)f.plotas(x, y));return 0;}

}public class testas{

public static void main (String[] args) {double i=5.0, j=3.0;

Figura fig = new Figura(i, j);Staciakampis sta = new Staciakampis(i, j);StatusisTrikampis tri = new StatusisTrikampis(j, i);skaiciuoti skaic = new skaiciuoti();plotas = sta.plotas(i,j); System.out.println(plotas);perimetras = sta.perimetras();System.out.println(perimetras);Figura figura;System.out.println();System.out.println("G R U P E - A");figura = fig;System.out.println("Plotas = "+(int)figura.plotas());System.out.println("Perimetras = "+(int)figura.perimetras());

class skaiciuoti{ skaiciuoti()

{super();}double skaiciuoti(Figura f, double x, double y)

{System.out.println(" Plotas = "+(int)f.plotas());System.out.println(" Perimetras = "+(int)f.perimetras());System.out.println(" Plotas = "+(int)f.plotas(x, y));return 0;}

}public class testas{

public static void main (String[] args) {double i=5.0, j=3.0;

Figura fig = new Figura(i, j);Staciakampis sta = new Staciakampis(i, j);StatusisTrikampis tri = new StatusisTrikampis(j, i);skaiciuoti skaic = new skaiciuoti();plotas = sta.plotas(i,j); System.out.println(plotas);perimetras = sta.perimetras();System.out.println(perimetras);Figura figura;System.out.println();System.out.println("G R U P E - A");figura = fig;System.out.println("Plotas = "+(int)figura.plotas());System.out.println("Perimetras = "+(int)figura.perimetras());

figura = sta;System.out.println("Plotas = "+(int)figura.plotas());System.out.println(" Perimetras = "+(int)figura.perimetras());System.out.println();System.out.println("G R U P E - B");System.out.println("Plotas = "+(int)fig.plotas());System.out.println("Perimetras = "+(int)fig.perimetras());System.out.println("Plotas = "+(int)sta.plotas());System.out.println(" Perimetras = "+(int)sta.perimetras());System.out.println("Plotas = "+(int)tri.plotas());System.out.println("Perimetras = "+(int)tri.perimetras());System.out.println();System.out.println("G R U P E - C");skaic.skaiciuoti(sta, 40, 30);skaic.skaiciuoti(new StatusisTrikampis(i, j), 10.5, 25.5);System.out.println();System.out.println("PABAIGA");}

}

figura = sta;System.out.println("Plotas = "+(int)figura.plotas());System.out.println(" Perimetras = "+(int)figura.perimetras());System.out.println();System.out.println("G R U P E - B");System.out.println("Plotas = "+(int)fig.plotas());System.out.println("Perimetras = "+(int)fig.perimetras());System.out.println("Plotas = "+(int)sta.plotas());System.out.println(" Perimetras = "+(int)sta.perimetras());System.out.println("Plotas = "+(int)tri.plotas());System.out.println("Perimetras = "+(int)tri.perimetras());System.out.println();System.out.println("G R U P E - C");skaic.skaiciuoti(sta, 40, 30);skaic.skaiciuoti(new StatusisTrikampis(i, j), 10.5, 25.5);System.out.println();System.out.println("PABAIGA");}

}

Koks bus atsaykmas ?

Staciakampio plotas = 15.0Staciakampio perimetras = 16.0

G R U P E - Aploto nera -> Plotas = -1perimetro nera -> Perimetras = -3Staciakampis:Plotas = 15Staciakampio perimetras = Perimetras = 16

G R U P E - Bploto nera -> Plotas = -1perimetro nera -> Perimetras = -3Staciakampis:Plotas = 15Staciakampio perimetras = Perimetras = 16Statusis trikampis:Plotas = 15Perimetras = 13

Staciakampio plotas = 15.0Staciakampio perimetras = 16.0

G R U P E - Aploto nera -> Plotas = -1perimetro nera -> Perimetras = -3Staciakampis:Plotas = 15Staciakampio perimetras = Perimetras = 16

G R U P E - Bploto nera -> Plotas = -1perimetro nera -> Perimetras = -3Staciakampis:Plotas = 15Staciakampio perimetras = Perimetras = 16Statusis trikampis:Plotas = 15Perimetras = 13

G R U P E - CStaciakampis: Plotas = 15Staciakampio perimetras = Perimetras = 16Staciakampio plotas = Plotas = 1200Statusis trikampis: Plotas = 15 Perimetras = 13 Stataus trikampio plotas = Plotas = 133

PABAIGA

G R U P E - CStaciakampis: Plotas = 15Staciakampio perimetras = Perimetras = 16Staciakampio plotas = Plotas = 1200Statusis trikampis: Plotas = 15 Perimetras = 13 Stataus trikampio plotas = Plotas = 133

PABAIGA

Klausimai ?