89
Objektorienteeritud programmeerimine 5. loeng 5. märts Eno Tõnisson 1

Objektorienteeritud programmeeriminekodu.ut.ee/~eno/oop12loeng/oop12loeng5d.pdf · 2012. 3. 5. · 3. üleilmastumine 4. kuidagi teisiti . Pärilus •ingl. k. inheritance •Mehhanism,

  • Upload
    others

  • View
    1

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Objektorienteeritud programmeeriminekodu.ut.ee/~eno/oop12loeng/oop12loeng5d.pdf · 2012. 3. 5. · 3. üleilmastumine 4. kuidagi teisiti . Pärilus •ingl. k. inheritance •Mehhanism,

Objektorienteeritud programmeerimine

5. loeng

5. märts

Eno Tõnisson

1

Page 2: Objektorienteeritud programmeeriminekodu.ut.ee/~eno/oop12loeng/oop12loeng5d.pdf · 2012. 3. 5. · 3. üleilmastumine 4. kuidagi teisiti . Pärilus •ingl. k. inheritance •Mehhanism,

Kasutatud

• H. Heina loengumaterjalid

• J. Kiho Väikest Java leksikon

• Y. D. Liang Introduction to Java Programming

2

Page 3: Objektorienteeritud programmeeriminekodu.ut.ee/~eno/oop12loeng/oop12loeng5d.pdf · 2012. 3. 5. · 3. üleilmastumine 4. kuidagi teisiti . Pärilus •ingl. k. inheritance •Mehhanism,

Eelmisel nädalal

• loeng

– sõned

– pärilus

• praktikum

– sõned

• 29. veebruar

3

Page 4: Objektorienteeritud programmeeriminekodu.ut.ee/~eno/oop12loeng/oop12loeng5d.pdf · 2012. 3. 5. · 3. üleilmastumine 4. kuidagi teisiti . Pärilus •ingl. k. inheritance •Mehhanism,

Umbes mitu tundi tegelesite eelmisel nädalal selle ainega (loeng+praktikum+iseseisvalt)?

1. paariline

4

1. 2. 3. 4. 5. 6. 7. 8.

0% 0% 0% 0%0%0%0%0%

1. 0-2 tundi

2. 2-4 tundi

3. 4-6 tundi

4. 6-8 tundi

5. 8-10 tundi

6. 10-12 tundi

7. 12-14 tundi

8. üle 14 tunni

Page 5: Objektorienteeritud programmeeriminekodu.ut.ee/~eno/oop12loeng/oop12loeng5d.pdf · 2012. 3. 5. · 3. üleilmastumine 4. kuidagi teisiti . Pärilus •ingl. k. inheritance •Mehhanism,

Kuivõrd olete selle ainega graafikus? 1. paariline

5

1. 2. 3. 4. 5.

0% 0% 0%0%0%

1. Isegi ees

2. Täiesti graafikus

3. Veidi maas, aga saan ise hakkama

4. Kõvasti maas, vajan abi

5. Ei oska öelda

Page 6: Objektorienteeritud programmeeriminekodu.ut.ee/~eno/oop12loeng/oop12loeng5d.pdf · 2012. 3. 5. · 3. üleilmastumine 4. kuidagi teisiti . Pärilus •ingl. k. inheritance •Mehhanism,

Umbes mitu tundi tegelesite eelmisel nädalal selle ainega (loeng+praktikum+iseseisvalt)?

2. paariline

6

1. 2. 3. 4. 5. 6. 7. 8.

0% 0% 0% 0%0%0%0%0%

1. 0-2 tundi

2. 2-4 tundi

3. 4-6 tundi

4. 6-8 tundi

5. 8-10 tundi

6. 10-12 tundi

7. 12-14 tundi

8. üle 14 tunni

Page 7: Objektorienteeritud programmeeriminekodu.ut.ee/~eno/oop12loeng/oop12loeng5d.pdf · 2012. 3. 5. · 3. üleilmastumine 4. kuidagi teisiti . Pärilus •ingl. k. inheritance •Mehhanism,

Kuivõrd olete selle ainega graafikus? 2. paariline

7

1. 2. 3. 4. 5.

0% 0% 0%0%0%

1. Isegi ees

2. Täiesti graafikus

3. Veidi maas, aga saan ise hakkama

4. Kõvasti maas, vajan abi

5. Ei oska öelda

Page 8: Objektorienteeritud programmeeriminekodu.ut.ee/~eno/oop12loeng/oop12loeng5d.pdf · 2012. 3. 5. · 3. üleilmastumine 4. kuidagi teisiti . Pärilus •ingl. k. inheritance •Mehhanism,

Täna • Organisatsioonilistest küsimustest

• Koodi vormistamine

• Pärilus – ülemklassid, alamklassid

– ülekate

– juurdepääsetavus

– polümorfism

• Abstraktsed klassid – abstraktsed meetodid

• Liidesed 8

Page 9: Objektorienteeritud programmeeriminekodu.ut.ee/~eno/oop12loeng/oop12loeng5d.pdf · 2012. 3. 5. · 3. üleilmastumine 4. kuidagi teisiti . Pärilus •ingl. k. inheritance •Mehhanism,

Organisatsioonilistest küsimustest

• Kursuse korraldus

• Kirjad ÕISist

9

Page 10: Objektorienteeritud programmeeriminekodu.ut.ee/~eno/oop12loeng/oop12loeng5d.pdf · 2012. 3. 5. · 3. üleilmastumine 4. kuidagi teisiti . Pärilus •ingl. k. inheritance •Mehhanism,

Koodi vormistamine

• Võib olla erinevaid standardeid

• http://www.oracle.com/technetwork/java/codeconv-138413.html

• Javas võib paljutki

– jätta taanded ära või panna eksitavalt

– int x = y += z = 1

– …

• Eesmärgiks on loetav kood

10

Page 11: Objektorienteeritud programmeeriminekodu.ut.ee/~eno/oop12loeng/oop12loeng5d.pdf · 2012. 3. 5. · 3. üleilmastumine 4. kuidagi teisiti . Pärilus •ingl. k. inheritance •Mehhanism,

Tehniliselt võib ju olla lubatud

11

PaarS.kordaja = 10;

PaarS p5 = new PaarS(2,4.1);

System.out.println(p5.kordaja);

public class PaarS {

static int kordaja;

int i;

double d;

PaarS(int i, double d) {

this.i = i*kordaja;

this.d = d;

}

}

Nii saab, aga peaks hoiduma.

Parem on PaarS.kordaja

Page 12: Objektorienteeritud programmeeriminekodu.ut.ee/~eno/oop12loeng/oop12loeng5d.pdf · 2012. 3. 5. · 3. üleilmastumine 4. kuidagi teisiti . Pärilus •ingl. k. inheritance •Mehhanism,

Järjekord klassis

• Järjekord klassis

– klassiväljad (static)

– isendiväljad

– konstruktorid

– meetodid

12

Page 13: Objektorienteeritud programmeeriminekodu.ut.ee/~eno/oop12loeng/oop12loeng5d.pdf · 2012. 3. 5. · 3. üleilmastumine 4. kuidagi teisiti . Pärilus •ingl. k. inheritance •Mehhanism,

13

public class A {

int a;

A(int a){

this.a = a;

}

void meetoda(){

System.out.println("Olen A isend, a = " + a);

}

}

public class TestABC {

public static void main(String[] args) {

A a1 = new A(17);

a1.meetoda();

}

}

Olen A isend, a = 17

Isendiväli

Konstruktor

Meetod

Page 14: Objektorienteeritud programmeeriminekodu.ut.ee/~eno/oop12loeng/oop12loeng5d.pdf · 2012. 3. 5. · 3. üleilmastumine 4. kuidagi teisiti . Pärilus •ingl. k. inheritance •Mehhanism,

14

public class B extends A {

int b;

B(int a, int b){

super(a);

this.b = b;

}

}

public class TestABC {

public static void main(String[] args) {

B b1 = new B(12,45);

b1.meetoda();

}

} Olen A isend, a = 12

Page 15: Objektorienteeritud programmeeriminekodu.ut.ee/~eno/oop12loeng/oop12loeng5d.pdf · 2012. 3. 5. · 3. üleilmastumine 4. kuidagi teisiti . Pärilus •ingl. k. inheritance •Mehhanism,

15

public class B extends A {

int b;

B(int a, int b){

super(a);

this.b = b;

}

}

public class A {

int a;

A(int a){

this.a = a;

}

void meetoda(){

System.out.println("Olen A isend, a = " + a);

}

}

Page 16: Objektorienteeritud programmeeriminekodu.ut.ee/~eno/oop12loeng/oop12loeng5d.pdf · 2012. 3. 5. · 3. üleilmastumine 4. kuidagi teisiti . Pärilus •ingl. k. inheritance •Mehhanism,

16

public class B extends A {

int b;

B(int a, int b){

super(a);

this.b = b;

}

void meetodb(){

System.out.println("Olen B isend, b = " + b);

}

}

public class TestABC {

public static void main(String[] args) {

B b1= new B(12,45);

b1.meetodb();

}

}

Olen B isend, b = 45

Page 17: Objektorienteeritud programmeeriminekodu.ut.ee/~eno/oop12loeng/oop12loeng5d.pdf · 2012. 3. 5. · 3. üleilmastumine 4. kuidagi teisiti . Pärilus •ingl. k. inheritance •Mehhanism,

17

public class B extends A {

int b;

B(int a, int b){

super(a);

this.b = b;

}

void meetodb(){

System.out.println("Olen B isend, b = " + b);

}

void meetoda(){

System.out.println("Olen B isend, a = " + a);

}

}

public class TestABC {

public static void main(String[] args) {

B b1= new B(12,45);

b1.meetoda();

}

} Olen B isend, a = 12

Siin ju oli juba klassist A päritud

meetoda?!

Ülekate

Page 18: Objektorienteeritud programmeeriminekodu.ut.ee/~eno/oop12loeng/oop12loeng5d.pdf · 2012. 3. 5. · 3. üleilmastumine 4. kuidagi teisiti . Pärilus •ingl. k. inheritance •Mehhanism,

18 1. 2. 3. 4. 5.

0% 0% 0%0%0%

Mida väljastab järgmine programmilõik?

A a1 = new A(17);

a1.meetodb();

1. 0

2. 17

3. mitte midagi

4. midagi muud

5. veateate

Page 19: Objektorienteeritud programmeeriminekodu.ut.ee/~eno/oop12loeng/oop12loeng5d.pdf · 2012. 3. 5. · 3. üleilmastumine 4. kuidagi teisiti . Pärilus •ingl. k. inheritance •Mehhanism,

19 1. 2. 3. 4.

0% 0%0%0%

Kuidas nimetatakse olukorda, kus klassi kuulub mitu sama nimega, kuid erineva signatuuriga

meetodit või mitu konstruktorit?

1. ülekate

2. üledefineerimine

3. üleilmastumine

4. kuidagi teisiti

Page 20: Objektorienteeritud programmeeriminekodu.ut.ee/~eno/oop12loeng/oop12loeng5d.pdf · 2012. 3. 5. · 3. üleilmastumine 4. kuidagi teisiti . Pärilus •ingl. k. inheritance •Mehhanism,

20 1. 2. 3. 4.

0% 0%0%0%

Kuidas nimetatakse olukorda, kus klassis kirjeldatud ja päriluse teel saadud meetodil

on üks ja sama signatuur?

1. ülekate

2. üledefineerimine

3. üleilmastumine

4. kuidagi teisiti

Page 21: Objektorienteeritud programmeeriminekodu.ut.ee/~eno/oop12loeng/oop12loeng5d.pdf · 2012. 3. 5. · 3. üleilmastumine 4. kuidagi teisiti . Pärilus •ingl. k. inheritance •Mehhanism,

Pärilus

• ingl. k. inheritance • Mehhanism, mis lisab igale klassikirjeldusele vahetu

ülemklassi liikmekirjeldused • Moodustub alamklasside ja ülemklasside hierarhiline

struktuur • Javas saab igal klassil olla üks vahetu ülemklass • Põhiline eelis selles, et kui ülemklass on juba koostatud,

siis saab seda kasutada uute spetsialiseeritud klasside loomiseks.

• Kuna alamklassi võimalused laienevad, siis kasutatakse sõna extends.

21

Page 22: Objektorienteeritud programmeeriminekodu.ut.ee/~eno/oop12loeng/oop12loeng5d.pdf · 2012. 3. 5. · 3. üleilmastumine 4. kuidagi teisiti . Pärilus •ingl. k. inheritance •Mehhanism,

Pärilus on tavaline

22

Page 23: Objektorienteeritud programmeeriminekodu.ut.ee/~eno/oop12loeng/oop12loeng5d.pdf · 2012. 3. 5. · 3. üleilmastumine 4. kuidagi teisiti . Pärilus •ingl. k. inheritance •Mehhanism,

Ülemklass, alamklass

class B extends A

A a1 = new A(17);

B b1 = new B(12,45);

a1 on A isend: a1 instanceof A b1 on B isend: b1 instanceof B b1 on ka A isend: b1 instanceof A

23

Klassis B

Näiteks peaklassis

true

true

true

Page 24: Objektorienteeritud programmeeriminekodu.ut.ee/~eno/oop12loeng/oop12loeng5d.pdf · 2012. 3. 5. · 3. üleilmastumine 4. kuidagi teisiti . Pärilus •ingl. k. inheritance •Mehhanism,

Ülemklass, alamklass

class B extends A

A a2 = new B(14,78);

// B b2 = new A(15); //VIGA

a2 on A isend??? a2 on B isend???

24

Page 25: Objektorienteeritud programmeeriminekodu.ut.ee/~eno/oop12loeng/oop12loeng5d.pdf · 2012. 3. 5. · 3. üleilmastumine 4. kuidagi teisiti . Pärilus •ingl. k. inheritance •Mehhanism,

25 1. 2. 3. 4. 5.

0% 0% 0%0%0%

Mida väljastab järgmine programmilõik?

A a2 = new B(14,78);

System.out.println(a2 instanceof A);

1. true

2. false

3. midagi muud

4. mitte midagi

5. veateate

Page 26: Objektorienteeritud programmeeriminekodu.ut.ee/~eno/oop12loeng/oop12loeng5d.pdf · 2012. 3. 5. · 3. üleilmastumine 4. kuidagi teisiti . Pärilus •ingl. k. inheritance •Mehhanism,

26 1. 2. 3. 4. 5.

0% 0% 0%0%0%

Mida väljastab järgmine programmilõik?

A a2 = new B(14,78);

System.out.println(a2.a);

1. 0

2. 14

3. midagi muud

4. mitte midagi

5. veateate

Page 27: Objektorienteeritud programmeeriminekodu.ut.ee/~eno/oop12loeng/oop12loeng5d.pdf · 2012. 3. 5. · 3. üleilmastumine 4. kuidagi teisiti . Pärilus •ingl. k. inheritance •Mehhanism,

27 1. 2. 3. 4. 5.

0% 0% 0%0%0%

Mida väljastab järgmine programmilõik?

A a2 = new B(14,78);

a2.meetoda();

1. Olen A isend, a = 14

2. Olen B isend, a = 14

3. midagi muud

4. mitte midagi

5. veateate

Page 28: Objektorienteeritud programmeeriminekodu.ut.ee/~eno/oop12loeng/oop12loeng5d.pdf · 2012. 3. 5. · 3. üleilmastumine 4. kuidagi teisiti . Pärilus •ingl. k. inheritance •Mehhanism,

28 1. 2. 3. 4. 5.

0% 0% 0%0%0%

Mida väljastab järgmine programmilõik?

A a2 = new B(14,78);

System.out.println(a2 instanceof B);

1. true

2. false

3. midagi muud

4. mitte midagi

5. veateate

Page 29: Objektorienteeritud programmeeriminekodu.ut.ee/~eno/oop12loeng/oop12loeng5d.pdf · 2012. 3. 5. · 3. üleilmastumine 4. kuidagi teisiti . Pärilus •ingl. k. inheritance •Mehhanism,

29 1. 2. 3. 4. 5.

0% 0% 0%0%0%

Mida väljastab järgmine programmilõik?

A a2 = new B(14,78);

System.out.println(a2.b);

1. 0

2. 78

3. midagi muud

4. mitte midagi

5. veateate

Page 30: Objektorienteeritud programmeeriminekodu.ut.ee/~eno/oop12loeng/oop12loeng5d.pdf · 2012. 3. 5. · 3. üleilmastumine 4. kuidagi teisiti . Pärilus •ingl. k. inheritance •Mehhanism,

30 1. 2. 3. 4. 5.

0% 0% 0%0%0%

Mida väljastab järgmine programmilõik?

A a2 = new B(14,78);

a2.meetodb();

1. Olen B isend, b = 78

2. Olen A isend, b = 78

3. midagi muud

4. mitte midagi

5. veateate

Page 31: Objektorienteeritud programmeeriminekodu.ut.ee/~eno/oop12loeng/oop12loeng5d.pdf · 2012. 3. 5. · 3. üleilmastumine 4. kuidagi teisiti . Pärilus •ingl. k. inheritance •Mehhanism,

A a2 = new B(14,78);

• a2.b

• a2.meetodb();

• ((B)a2).b

• ((B)a2).meetodb();

31

Veateade

Veateade

Kitsendav viidateisendus

Sulud, sest . on kõrgema

prioriteediga, kui (B)

78

Olen B isend, b = 78

Page 32: Objektorienteeritud programmeeriminekodu.ut.ee/~eno/oop12loeng/oop12loeng5d.pdf · 2012. 3. 5. · 3. üleilmastumine 4. kuidagi teisiti . Pärilus •ingl. k. inheritance •Mehhanism,

Pärilus, juurdepääs isendi elementidele

• Alamklassist on juurdepääs kõikidele ülemklassi liikmetele välja arvatud need, mis on deklareeritud privaatseks (piiritleja private).

32

public class A {

private int a;

A(int a){

this.a = a;

}

void meetoda(){

System.out.println("Olen A isend, a

= " + a);

}

}

Page 33: Objektorienteeritud programmeeriminekodu.ut.ee/~eno/oop12loeng/oop12loeng5d.pdf · 2012. 3. 5. · 3. üleilmastumine 4. kuidagi teisiti . Pärilus •ingl. k. inheritance •Mehhanism,

33

public class TestABC {

public static void main(String[] args) {

A a1 = new A(17);

//System.out.println(a1.a); VIGA

a1.meetoda();

}

}

public class A {

private int a;

A(int a){

this.a = a;

}

void meetoda(){

System.out.println("Olen A isend, a

= " + a);

}

}

Page 34: Objektorienteeritud programmeeriminekodu.ut.ee/~eno/oop12loeng/oop12loeng5d.pdf · 2012. 3. 5. · 3. üleilmastumine 4. kuidagi teisiti . Pärilus •ingl. k. inheritance •Mehhanism,

Klass B muutus vigaseks!

34

public class B extends A {

int b;

B(int a, int b){

super(a);

this.b = b;

}

void meetoda(){

System.out.println("Olen B isend, a = " + a);

}

void meetodb(){

System.out.println("Olen B isend, b = " + b);

}

}

Page 35: Objektorienteeritud programmeeriminekodu.ut.ee/~eno/oop12loeng/oop12loeng5d.pdf · 2012. 3. 5. · 3. üleilmastumine 4. kuidagi teisiti . Pärilus •ingl. k. inheritance •Mehhanism,

Ka meetod võib olla privaatne

35

public class A {

private int a;

A(int a){

this.a = a;

}

private void meetoda(){

System.out.println("Olen A isend, a

= " + a);

}

}

public class TestABC {

public static void main(String[] args) {

A a1 = new A(17);

//System.out.println(a1.a); VIGA

//a1.meetoda(); VIGA

}

}

Page 36: Objektorienteeritud programmeeriminekodu.ut.ee/~eno/oop12loeng/oop12loeng5d.pdf · 2012. 3. 5. · 3. üleilmastumine 4. kuidagi teisiti . Pärilus •ingl. k. inheritance •Mehhanism,

protected

• kaitstud

• nähtav nii oma paketis kui ka alamklassides (mis võivad olla teistes pakettides)

36

Page 37: Objektorienteeritud programmeeriminekodu.ut.ee/~eno/oop12loeng/oop12loeng5d.pdf · 2012. 3. 5. · 3. üleilmastumine 4. kuidagi teisiti . Pärilus •ingl. k. inheritance •Mehhanism,

Kaitstud

37

public class A {

protected int a;

A(int a){

this.a = a;

}

protected void meetoda(){

System.out.println("Olen A isend, a

= " + a);

}

}

public class TestABC {

public static void main(String[] args) {

A a1 = new A(17);

System.out.println(a1.a);

a1.meetoda();

}

}

Page 38: Objektorienteeritud programmeeriminekodu.ut.ee/~eno/oop12loeng/oop12loeng5d.pdf · 2012. 3. 5. · 3. üleilmastumine 4. kuidagi teisiti . Pärilus •ingl. k. inheritance •Mehhanism,

Klassis B ikka viga!

38

public class B extends A {

int b;

B(int a, int b){

super(a);

this.b = b;

}

void meetoda(){

System.out.println("Olen B isend, a = " + a);

}

void meetodb(){

System.out.println("Olen B isend, b = " + b);

}

}

ülekate ei tohi kitsendada meetodi nähtavust, vaja piiritlejat protected või public

Page 39: Objektorienteeritud programmeeriminekodu.ut.ee/~eno/oop12loeng/oop12loeng5d.pdf · 2012. 3. 5. · 3. üleilmastumine 4. kuidagi teisiti . Pärilus •ingl. k. inheritance •Mehhanism,

Nähtavus

39

Piiritleja Samas klassis

Samas paketis

Alam-klassis

Teises paketis

private jah ei ei ei

(puudub) jah jah ei ei

protected jah jah jah ei

public jah jah jah jah

Page 40: Objektorienteeritud programmeeriminekodu.ut.ee/~eno/oop12loeng/oop12loeng5d.pdf · 2012. 3. 5. · 3. üleilmastumine 4. kuidagi teisiti . Pärilus •ingl. k. inheritance •Mehhanism,

40 1. 2.

0%0%

Kui ülemklassis on meetod avalik (public), kas alamklassis saab selle

meetodi ülekate olla privaatne?

1. jah

2. ei

Page 41: Objektorienteeritud programmeeriminekodu.ut.ee/~eno/oop12loeng/oop12loeng5d.pdf · 2012. 3. 5. · 3. üleilmastumine 4. kuidagi teisiti . Pärilus •ingl. k. inheritance •Mehhanism,

41 1. 2.

0%0%

Kas kaitstud (protected) meetoditele on juurdepääs ka nendest alamklassidest, mis

on teistes pakettides?

1. jah

2. ei

Page 42: Objektorienteeritud programmeeriminekodu.ut.ee/~eno/oop12loeng/oop12loeng5d.pdf · 2012. 3. 5. · 3. üleilmastumine 4. kuidagi teisiti . Pärilus •ingl. k. inheritance •Mehhanism,

Võtmesõna super

• Kaks rakendusviisi

– ülemklassi konstruktori poole pöördumiseks

– vahetu ülemklassi nende liikmete poole pöördumiseks, mis on üle kaetud

42

Page 43: Objektorienteeritud programmeeriminekodu.ut.ee/~eno/oop12loeng/oop12loeng5d.pdf · 2012. 3. 5. · 3. üleilmastumine 4. kuidagi teisiti . Pärilus •ingl. k. inheritance •Mehhanism,

Võtmesõna super

43

public class B extends A {

int b;

B(int a, int b){

super(a);

this.b = b;

}

protected void meetoda(){

System.out.println("Olen B isend, a = " + a);

}

void meetodb(){

System.out.println("Olen B isend, b = " + b);

}

void meetodaAst(){

super.meetoda();

}

}

Page 44: Objektorienteeritud programmeeriminekodu.ut.ee/~eno/oop12loeng/oop12loeng5d.pdf · 2012. 3. 5. · 3. üleilmastumine 4. kuidagi teisiti . Pärilus •ingl. k. inheritance •Mehhanism,

Konstruktorid

• ei pärita

• Konstruktor võib välja kutsuda – üledefineeritud konstruktori (this(...))

– vahetu ülemklassi konstruktori (super(...)).

– Kui kumbagi neist ei ole kasutatud, siis kompilaator lisab käsu super() konstruktori esimeseks lauseks. Seda nimetatakse konstruktorite aheldamiseks (ingl. k. chaining).

44

Page 45: Objektorienteeritud programmeeriminekodu.ut.ee/~eno/oop12loeng/oop12loeng5d.pdf · 2012. 3. 5. · 3. üleilmastumine 4. kuidagi teisiti . Pärilus •ingl. k. inheritance •Mehhanism,

super

45

public A(){

}

public A(){

super();

}

public A(int i){

super();

//laused

}

public A(int i){

//laused

}

sama

sama

Page 46: Objektorienteeritud programmeeriminekodu.ut.ee/~eno/oop12loeng/oop12loeng5d.pdf · 2012. 3. 5. · 3. üleilmastumine 4. kuidagi teisiti . Pärilus •ingl. k. inheritance •Mehhanism,

Aga isendiväljad, klassiväljad?

• Kas isendivälju saab üle katta?

• Kas klassivälju saab üle katta?

• Kas klassimeetodeid saab üle katta?

• Vaatame edaspidistes loengutes

46

Page 47: Objektorienteeritud programmeeriminekodu.ut.ee/~eno/oop12loeng/oop12loeng5d.pdf · 2012. 3. 5. · 3. üleilmastumine 4. kuidagi teisiti . Pärilus •ingl. k. inheritance •Mehhanism,

Ei ole ülekate, ei saa üle katta

• Meetodid ja andmeväljad, mis on ülemklassis privaatsed, ei ole alamklassis nähtavad, seega nad ei ole ülekaetavad.

– Kui alamklassis ikkagi defineerida sama signatuuriga meetod, mis on ülemklassis, siis on need on täiesti eraldiseisvad meetodid.

• Üle ei saa katta meetodit piiritlejaga final

47

Page 48: Objektorienteeritud programmeeriminekodu.ut.ee/~eno/oop12loeng/oop12loeng5d.pdf · 2012. 3. 5. · 3. üleilmastumine 4. kuidagi teisiti . Pärilus •ingl. k. inheritance •Mehhanism,

Milline variant meetodist ikkagi rakendub?

• Võtame pikema ahela

• Object

– Isik

• Tudeng

– Magistrant

• meetod toString(), mis on juba klassis Object olemas

48

Page 49: Objektorienteeritud programmeeriminekodu.ut.ee/~eno/oop12loeng/oop12loeng5d.pdf · 2012. 3. 5. · 3. üleilmastumine 4. kuidagi teisiti . Pärilus •ingl. k. inheritance •Mehhanism,

49

public class Isik extends Object {

public String toString(){

return "Isik";

}

}

public class Tudeng extends Isik {

public String toString(){

return "Tudeng";

}

}

public class Magistrant extends Tudeng {

}

Page 50: Objektorienteeritud programmeeriminekodu.ut.ee/~eno/oop12loeng/oop12loeng5d.pdf · 2012. 3. 5. · 3. üleilmastumine 4. kuidagi teisiti . Pärilus •ingl. k. inheritance •Mehhanism,

50 1. 2. 3. 4. 5. 6. 7.

0% 0% 0% 0%0%0%0%

Mida väljastab järgmine programmilõik?

public class TestPol {

public static void main(String[] args) {

m(new Object());

}

public static void m(Object x){

System.out.println(x.toString());

}

}

1. Magistrant

2. Tudeng

3. Isik

4. java.lang.Object@13f5d07 vms.

5. mitte midagi

6. midagi muud

7. veateate

Page 51: Objektorienteeritud programmeeriminekodu.ut.ee/~eno/oop12loeng/oop12loeng5d.pdf · 2012. 3. 5. · 3. üleilmastumine 4. kuidagi teisiti . Pärilus •ingl. k. inheritance •Mehhanism,

51 1. 2. 3. 4. 5. 6. 7.

0% 0% 0% 0%0%0%0%

Mida väljastab järgmine programmilõik?

public class TestPol {

public static void main(String[] args) {

m(new Isik());

}

public static void m(Object x){

System.out.println(x.toString());

}

}

1. Magistrant

2. Tudeng

3. Isik

4. java.lang.Object@13f5d07 vms.

5. mitte midagi

6. midagi muud

7. veateate

Page 52: Objektorienteeritud programmeeriminekodu.ut.ee/~eno/oop12loeng/oop12loeng5d.pdf · 2012. 3. 5. · 3. üleilmastumine 4. kuidagi teisiti . Pärilus •ingl. k. inheritance •Mehhanism,

52 1. 2. 3. 4. 5. 6. 7.

0% 0% 0% 0%0%0%0%

Mida väljastab järgmine programmilõik?

public class TestPol {

public static void main(String[] args) {

m(new Tudeng());

}

public static void m(Object x){

System.out.println(x.toString());

}

}

1. Magistrant

2. Tudeng

3. Isik

4. java.lang.Object@13f5d07 vms.

5. mitte midagi

6. midagi muud

7. veateate

Page 53: Objektorienteeritud programmeeriminekodu.ut.ee/~eno/oop12loeng/oop12loeng5d.pdf · 2012. 3. 5. · 3. üleilmastumine 4. kuidagi teisiti . Pärilus •ingl. k. inheritance •Mehhanism,

53 1. 2. 3. 4. 5. 6. 7.

0% 0% 0% 0%0%0%0%

Mida väljastab järgmine programmilõik?

public class TestPol {

public static void main(String[] args) {

m(new Magistrant());

}

public static void m(Object x){

System.out.println(x.toString());

}

}

1. Magistrant

2. Tudeng

3. Isik

4. java.lang.Object@13f5d07 vms.

5. mitte midagi

6. midagi muud

7. veateate

Page 54: Objektorienteeritud programmeeriminekodu.ut.ee/~eno/oop12loeng/oop12loeng5d.pdf · 2012. 3. 5. · 3. üleilmastumine 4. kuidagi teisiti . Pärilus •ingl. k. inheritance •Mehhanism,

54

public class Isik extends Object {

public String toString(){

return "Isik";

}

}

public class Tudeng extends Isik {

public String toString(){

return "Tudeng";

}

}

public class Magistrant extends Tudeng {

}

Page 55: Objektorienteeritud programmeeriminekodu.ut.ee/~eno/oop12loeng/oop12loeng5d.pdf · 2012. 3. 5. · 3. üleilmastumine 4. kuidagi teisiti . Pärilus •ingl. k. inheritance •Mehhanism,

Dünaamiline seostamine, hiline seostamine

• ingl. k. dynamic method dispatch, late binding

• See, millise meetodi poole täpselt pöördutakse, otsustatakse mitte kompileerimise, vaid programmi täitmise käigus. – Ülekatte puhul just nii tehaksegi

• Olgu klass K1 klassi K2 alamklass, klass K2 klassi K3 alamklass, …, Kn-1 klassi Kn alamklass.

• Kui o on klassi K1 isend, siis on ta ju ka K2 ,…, Kn isend.

• Vastavat meetodit hakatakse otsima alates K1 ja kui leitakse, siis rakendatakse.

55

Kn-1 Kn K2 K1

java.lang.Object

Page 56: Objektorienteeritud programmeeriminekodu.ut.ee/~eno/oop12loeng/oop12loeng5d.pdf · 2012. 3. 5. · 3. üleilmastumine 4. kuidagi teisiti . Pärilus •ingl. k. inheritance •Mehhanism,

Polümorfism

• Eesti keeles muidu: Mitmekujulisus

• Erinevaid käsitlusi

• Räägime põhjalikumalt järgmisel korral

56

Page 57: Objektorienteeritud programmeeriminekodu.ut.ee/~eno/oop12loeng/oop12loeng5d.pdf · 2012. 3. 5. · 3. üleilmastumine 4. kuidagi teisiti . Pärilus •ingl. k. inheritance •Mehhanism,

Klassikaline näide loomade häältega

• http://en.wikipedia.org/wiki/Bark_(utterance)

57

public class Koer {

String nimi;

Koer(String nimi) {

this.nimi = nimi;

}

void haugu(){

}

}

Page 58: Objektorienteeritud programmeeriminekodu.ut.ee/~eno/oop12loeng/oop12loeng5d.pdf · 2012. 3. 5. · 3. üleilmastumine 4. kuidagi teisiti . Pärilus •ingl. k. inheritance •Mehhanism,

58

public class EestiKoer extends Koer {

EestiKoer(String nimi) {

super(nimi);

}

void haugu(){

System.out.println("Auh, auh!");

}

}

public class LätiKoer extends Koer{

LätiKoer(String nimi) {

super(nimi);

}

void haugu(){

System.out.println("Vau, vau!");

}

}

Page 59: Objektorienteeritud programmeeriminekodu.ut.ee/~eno/oop12loeng/oop12loeng5d.pdf · 2012. 3. 5. · 3. üleilmastumine 4. kuidagi teisiti . Pärilus •ingl. k. inheritance •Mehhanism,

59

public class EestiKoer extends Koer {

EestiKoer(String nimi) {

super(nimi);

}

void haugu(){

System.out.println("Auh, auh!");

}

}

public class LätiKoer extends Koer{

LätiKoer(String nimi) {

super(nimi);

}

void haugu(){

System.out.println("Vau, vau!");

}

}

public class VeneKoer extends Koer {

VeneKoer(String nimi) {

super(nimi);

}

void haugu(){

System.out.println("Gav, gav!");

}

}

Page 60: Objektorienteeritud programmeeriminekodu.ut.ee/~eno/oop12loeng/oop12loeng5d.pdf · 2012. 3. 5. · 3. üleilmastumine 4. kuidagi teisiti . Pärilus •ingl. k. inheritance •Mehhanism,

60

public class EestiKoer extends Koer {

EestiKoer(String nimi) {

super(nimi);

}

void haugu(){

System.out.println("Auh, auh!");

}

}

public class LätiKoer extends Koer{

LätiKoer(String nimi) {

super(nimi);

}

void haugu(){

System.out.println("Vau, vau!");

}

}

public class VeneKoer extends Koer {

VeneKoer(String nimi) {

super(nimi);

}

void haugu(){

System.out.println("Gav, gav!");

}

}

public class SoomeKoer extends Koer {

SoomeKoer(String nimi) {

super(nimi);

}

void haugu(){

System.out.println("Vuh, vuh!");

}

}

Page 61: Objektorienteeritud programmeeriminekodu.ut.ee/~eno/oop12loeng/oop12loeng5d.pdf · 2012. 3. 5. · 3. üleilmastumine 4. kuidagi teisiti . Pärilus •ingl. k. inheritance •Mehhanism,

61

public class EestiKoer extends Koer {

EestiKoer(String nimi) {

super(nimi);

}

void haugu(){

System.out.println("Auh, auh!");

}

}

public class LätiKoer extends Koer{

LätiKoer(String nimi) {

super(nimi);

}

void haugu(){

System.out.println("Vau, vau!");

}

}

public class VeneKoer extends Koer {

VeneKoer(String nimi) {

super(nimi);

}

void haugu(){

System.out.println("Gav, gav!");

}

}

public class SoomeKoer extends Koer {

SoomeKoer(String nimi) {

super(nimi);

}

void haugu(){

System.out.println("Vuh, vuh!");

}

}

public class KoreaKoer extends Koer{

KoreaKoer(String nimi) {

super(nimi);

}

void haugu(){

System.out.println("Meong, Meong!");

}

}

Page 62: Objektorienteeritud programmeeriminekodu.ut.ee/~eno/oop12loeng/oop12loeng5d.pdf · 2012. 3. 5. · 3. üleilmastumine 4. kuidagi teisiti . Pärilus •ingl. k. inheritance •Mehhanism,

62

public class KoerteTest {

public static void main(String[] args){

Koer k1 = new VeneKoer("Šarik");

Koer k2 = new LätiKoer("DWARF'S VALLEY

NIGHT BLUES");

Koer k3 = new SoomeKoer("TADJ MAHAL

ELANISMAES");

Koer k4 = new KoreaKoer("");

Koer k5 = new EestiKoer("Muri");

Koer[] koerad = {k1, k2, k3, k4, k5};

for (Koer k : koerad){

k.haugu();

}

}

}

Gav, gav! Vau, vau! Vuh, vuh! Meong, Meong! Auh, auh!

Page 63: Objektorienteeritud programmeeriminekodu.ut.ee/~eno/oop12loeng/oop12loeng5d.pdf · 2012. 3. 5. · 3. üleilmastumine 4. kuidagi teisiti . Pärilus •ingl. k. inheritance •Mehhanism,

63

public class SuurEestiKoer extends EestiKoer {

SuurEestiKoer(String nimi) {

super(nimi);

}

}

Koer k6 = new SuurEestiKoer("Muki");

k6.haugu();

Auh, auh!

On Koer On EestiKoer

Page 64: Objektorienteeritud programmeeriminekodu.ut.ee/~eno/oop12loeng/oop12loeng5d.pdf · 2012. 3. 5. · 3. üleilmastumine 4. kuidagi teisiti . Pärilus •ingl. k. inheritance •Mehhanism,

Meetod, mis midagi ei teinud

64

public class Koer {

String nimi;

Koer(String nimi) {

this.nimi = nimi;

}

void haugu(){

}

}

Page 65: Objektorienteeritud programmeeriminekodu.ut.ee/~eno/oop12loeng/oop12loeng5d.pdf · 2012. 3. 5. · 3. üleilmastumine 4. kuidagi teisiti . Pärilus •ingl. k. inheritance •Mehhanism,

Niisiis • Alamklass saadakse ülemklassist spetsialiseerimise

teel – uusi välju – uusi meetodeid – ülekate (meetodid teistmoodi)

• Minimaalse dubleerimise saavutamiseks tuleks objekti omadus realiseerida kõrgeimal võimalikul üldistustasemel

• Kui ülemklass nii üldine, et ei saa üldse meetodi sisu kirjutada – abstraktne meetod, abstraktne klass

• Javas võimalik ainult üks vahetu ülemklass – abiks on liides

65

Page 66: Objektorienteeritud programmeeriminekodu.ut.ee/~eno/oop12loeng/oop12loeng5d.pdf · 2012. 3. 5. · 3. üleilmastumine 4. kuidagi teisiti . Pärilus •ingl. k. inheritance •Mehhanism,

Abstraktne meetod

• ilma kehata ehk realiseerimata meetod

• ainult semikoolon

• piiritleja abstract

• ei saa samal ajal olla private, final ega static

• abstract tüüp nimi(form. parameetrid);

• abstract void haugu();

66

Page 67: Objektorienteeritud programmeeriminekodu.ut.ee/~eno/oop12loeng/oop12loeng5d.pdf · 2012. 3. 5. · 3. üleilmastumine 4. kuidagi teisiti . Pärilus •ingl. k. inheritance •Mehhanism,

Abstraktne klass

• Klass, milles on abstraktseid meetodeid tuleb kuulutada abstraktseks.

• piiritleja abstract

• mõeldud kasutamiseks ülemklassina

• alamklass peab realiseerima ülemklassi abstraktsed meetodid või olema ise ka abstraktne.

67

Page 68: Objektorienteeritud programmeeriminekodu.ut.ee/~eno/oop12loeng/oop12loeng5d.pdf · 2012. 3. 5. · 3. üleilmastumine 4. kuidagi teisiti . Pärilus •ingl. k. inheritance •Mehhanism,

Abstraktne klass

68

abstract public class Koer {

String nimi;

Koer(String nimi) {

this.nimi = nimi;

}

abstract void haugu();

}

Page 69: Objektorienteeritud programmeeriminekodu.ut.ee/~eno/oop12loeng/oop12loeng5d.pdf · 2012. 3. 5. · 3. üleilmastumine 4. kuidagi teisiti . Pärilus •ingl. k. inheritance •Mehhanism,

Abstraktne klass

• Alamklass võib olla abstraktne, isegi kui ülemklass seda ei ole, nt klass Object ju ei ole abstraktne.

• Abstraktsest klassist ei saa luua isendit, aga seda võib kasutada tüübina.

69

public class KoerteTest {

public static void main(String[] args){

Koer k5 = new EestiKoer("Muri");

//Koer k7 = new Koer("Lassie"); //VIGA

}

}

Page 70: Objektorienteeritud programmeeriminekodu.ut.ee/~eno/oop12loeng/oop12loeng5d.pdf · 2012. 3. 5. · 3. üleilmastumine 4. kuidagi teisiti . Pärilus •ingl. k. inheritance •Mehhanism,

Miks abstraktseks?

• Sunnime pärima ja ühtlasi realiseerima ülemklassi kõik meetodid.

70

Page 71: Objektorienteeritud programmeeriminekodu.ut.ee/~eno/oop12loeng/oop12loeng5d.pdf · 2012. 3. 5. · 3. üleilmastumine 4. kuidagi teisiti . Pärilus •ingl. k. inheritance •Mehhanism,

71

On ka APIs

Page 72: Objektorienteeritud programmeeriminekodu.ut.ee/~eno/oop12loeng/oop12loeng5d.pdf · 2012. 3. 5. · 3. üleilmastumine 4. kuidagi teisiti . Pärilus •ingl. k. inheritance •Mehhanism,

Kalender

72

Page 73: Objektorienteeritud programmeeriminekodu.ut.ee/~eno/oop12loeng/oop12loeng5d.pdf · 2012. 3. 5. · 3. üleilmastumine 4. kuidagi teisiti . Pärilus •ingl. k. inheritance •Mehhanism,

73 1. 2.

0%0%

Kas abstraktses klassis võib olla mitteabstraktseid meetodeid?

1. jah

2. ei

Page 74: Objektorienteeritud programmeeriminekodu.ut.ee/~eno/oop12loeng/oop12loeng5d.pdf · 2012. 3. 5. · 3. üleilmastumine 4. kuidagi teisiti . Pärilus •ingl. k. inheritance •Mehhanism,

74 1. 2.

0%0%

Kas abstraktne meetod võib olla privaatne?

1. jah

2. ei

Page 75: Objektorienteeritud programmeeriminekodu.ut.ee/~eno/oop12loeng/oop12loeng5d.pdf · 2012. 3. 5. · 3. üleilmastumine 4. kuidagi teisiti . Pärilus •ingl. k. inheritance •Mehhanism,

Liidesed (interfaces)

• Liides on abstraktsete meetodite komplekt, mille

realisatsioonid täpsustatakse selle liidesega seostatud klassides.

• Liides võib sisaldada ka konstante.

piiritlejad interface LiideseNimi {

// Konstantide deklaratsioonid

// Meetodite signatuurid

• Liidese realiseerimiseks klassis kasutatakse võtmesõna implements. – Sellega nagu antakse lubadus, et kõik

realiseeritakse

75

Page 76: Objektorienteeritud programmeeriminekodu.ut.ee/~eno/oop12loeng/oop12loeng5d.pdf · 2012. 3. 5. · 3. üleilmastumine 4. kuidagi teisiti . Pärilus •ingl. k. inheritance •Mehhanism,

Liides

• Liidese realiseerimisel peab klass realiseerima kõik liideses deklareeritud meetodid, vastasel juhul tuleb klass kuulutada abstraktseks.

• Liideses deklareeritud

– meetodid on piiritlejatega public abstract

– konstandid piiritlejatega public static final

aga seda ei pea eraldi märkima

76

Page 77: Objektorienteeritud programmeeriminekodu.ut.ee/~eno/oop12loeng/oop12loeng5d.pdf · 2012. 3. 5. · 3. üleilmastumine 4. kuidagi teisiti . Pärilus •ingl. k. inheritance •Mehhanism,

77

public interface Söödav {

public String kuidasSüüa();

}

public class Riis implements Söödav {

public String kuidasSüüa(){

return "keedetult";

}

}

public class Kartul implements Söödav {

public String kuidasSüüa() {

return "keedetult või praetult";

}

}

Page 78: Objektorienteeritud programmeeriminekodu.ut.ee/~eno/oop12loeng/oop12loeng5d.pdf · 2012. 3. 5. · 3. üleilmastumine 4. kuidagi teisiti . Pärilus •ingl. k. inheritance •Mehhanism,

78 1. 2. 3. 4.

0% 0%0%0%

Mida väljastab järgmine programmilõik?

public class SöögiTest {

public static void main(String[] args) {

System.out.println(new Riis().kuidasSüüa());

}

}

1. keedetult

2. mitte midagi

3. midagi muud

4. veateate

Page 79: Objektorienteeritud programmeeriminekodu.ut.ee/~eno/oop12loeng/oop12loeng5d.pdf · 2012. 3. 5. · 3. üleilmastumine 4. kuidagi teisiti . Pärilus •ingl. k. inheritance •Mehhanism,

79 1. 2. 3. 4.

0% 0%0%0%

Mida väljastab järgmine programmilõik?

public class SöögiTest {

public static void main(String[] args) {

Söödav t1 = new Riis();

System.out.println(t1.kuidasSüüa());

}

}

1. keedetult

2. mitte midagi

3. midagi muud

4. veateate

Page 80: Objektorienteeritud programmeeriminekodu.ut.ee/~eno/oop12loeng/oop12loeng5d.pdf · 2012. 3. 5. · 3. üleilmastumine 4. kuidagi teisiti . Pärilus •ingl. k. inheritance •Mehhanism,

80 1. 2. 3. 4.

0% 0%0%0%

Mida väljastab järgmine programmilõik?

public class SöögiTest {

public static void main(String[] args) {

Söödav t2 = new Söödav();

System.out.println(t2.kuidasSüüa());

}

}

1. keedetult

2. mitte midagi

3. midagi muud

4. veateate

Page 81: Objektorienteeritud programmeeriminekodu.ut.ee/~eno/oop12loeng/oop12loeng5d.pdf · 2012. 3. 5. · 3. üleilmastumine 4. kuidagi teisiti . Pärilus •ingl. k. inheritance •Mehhanism,

Liides java.lang.Comparable

81

Page 82: Objektorienteeritud programmeeriminekodu.ut.ee/~eno/oop12loeng/oop12loeng5d.pdf · 2012. 3. 5. · 3. üleilmastumine 4. kuidagi teisiti . Pärilus •ingl. k. inheritance •Mehhanism,

Veel liideseid

82

Page 83: Objektorienteeritud programmeeriminekodu.ut.ee/~eno/oop12loeng/oop12loeng5d.pdf · 2012. 3. 5. · 3. üleilmastumine 4. kuidagi teisiti . Pärilus •ingl. k. inheritance •Mehhanism,

Veel liidestest

• Üks klass võib realiseerida mitu liidest, kusjuures liidesed võivad sisaldada sama meetodit

• Liideses võib olla alamliideseid, oma hierarhia

83

Page 84: Objektorienteeritud programmeeriminekodu.ut.ee/~eno/oop12loeng/oop12loeng5d.pdf · 2012. 3. 5. · 3. üleilmastumine 4. kuidagi teisiti . Pärilus •ingl. k. inheritance •Mehhanism,

Kontrolltöö 1

• Konsultatsioon

– reedel, 9. märtsil kell 16.15 Liivi 2-004

– registreerimine Moodle’is

• Kontrolltöö

– 6. nädalal, praktikumide ajal

• Järeltöö

– mõne nädala pärast

84

Page 85: Objektorienteeritud programmeeriminekodu.ut.ee/~eno/oop12loeng/oop12loeng5d.pdf · 2012. 3. 5. · 3. üleilmastumine 4. kuidagi teisiti . Pärilus •ingl. k. inheritance •Mehhanism,

Loengu tempo oli 1. paariline

85 1. 2. 3.

0% 0%0%

1. liiga kiire

2. paras

3. liiga aeglane

Page 86: Objektorienteeritud programmeeriminekodu.ut.ee/~eno/oop12loeng/oop12loeng5d.pdf · 2012. 3. 5. · 3. üleilmastumine 4. kuidagi teisiti . Pärilus •ingl. k. inheritance •Mehhanism,

Materjal tundus 1. paariline

86 1. 2. 3.

0% 0%0%

1. liiga lihtne

2. parajalt jõukohane

3. liiga keeruline

Page 87: Objektorienteeritud programmeeriminekodu.ut.ee/~eno/oop12loeng/oop12loeng5d.pdf · 2012. 3. 5. · 3. üleilmastumine 4. kuidagi teisiti . Pärilus •ingl. k. inheritance •Mehhanism,

Loengu tempo oli 2. paariline

87 1. 2. 3.

0% 0%0%

1. liiga kiire

2. paras

3. liiga aeglane

Page 88: Objektorienteeritud programmeeriminekodu.ut.ee/~eno/oop12loeng/oop12loeng5d.pdf · 2012. 3. 5. · 3. üleilmastumine 4. kuidagi teisiti . Pärilus •ingl. k. inheritance •Mehhanism,

Materjal tundus 2. paariline

88 1. 2. 3.

0% 0%0%

1. liiga lihtne

2. parajalt jõukohane

3. liiga keeruline

Page 89: Objektorienteeritud programmeeriminekodu.ut.ee/~eno/oop12loeng/oop12loeng5d.pdf · 2012. 3. 5. · 3. üleilmastumine 4. kuidagi teisiti . Pärilus •ingl. k. inheritance •Mehhanism,

Suur tänu osalemast! Kohtumiseni!

89