Przykład 1

class Para {

void pokaz ( ) {//metoda klasy ParaD

JAVA

int a,b;

System.out.print( nazwa );

Para (int x, int y) {a=x; b=y; }

super.pokaz ( );

Polimorfizm i interfejsy

void pokaz( ) {//metoda klasy Para

}//koniec klasy ParaD

System.out.println(" (" + a + ", "

+ b + " ) " ); }

public class test {

Beata Pańczyk - Java (Wykład 4)

}

//koniec klasy Para

public static void main(String [ ] args)

class ParaD extends Para {

{

String nazwa;

ParaD pd=new ParaD("Pd",10,20);

ParaD( String s, int x, int y){

Para p=pd;

super(x,y); nazwa=s;}

pd.pokaz();

}

p.pokaz();

}

}

2

Metody wirtualne

Metody wirtualne

• Wiązanie odwołań z kodem następuje w fazie Wszystkie metody w Javie są wirtualne za wyjątkiem: wykonania a nie kompilacji (dynamic binding, late

•

metod statycznych (nie dotyczą obiektów) binding) – technicznie realizowane jest poprzez wykorzystanie ukrytego w obiekcie wskaźnika na

•

metod ze specyfikatorem final (postać metody jest prawdziwy typ obiektu

ostateczna i nie moŜe być predefiniowana w klasach pochodnych) - tu kompilator wiąŜe statycznie

• Metoda pokaz() z przykładu 1 jest metodą wirtualną

•

metod prywatnych (dla których odwołania w

• Odwołania do metod wirtualnych są polimorficzne innych metodach danej klasy nie są polimorficzne) tzn. konkretny efekt odwołania przybiera róŜne kształty w zaleŜności od tego jaki jest faktyczny typ obiektu, na rzecz którego aktywowano metodę wirtualną

3

4

Metody i klasy abstrakcyjne

Metody i klasy abstrakcyjne

• metoda abstrakcyjna nie ma implementacji i

• Klasa abstrakcyjna nie musi mieć metod

powinna być zdefiniowana ze specyfikatorem abstract abstrakcyjnych

np.

abstract int pobierz();

• Abstrakcyjność klasy oznacza, Ŝe nie moŜna

• klasa, w której zdefiniowano jakąkolwiek metodę tworzyć bezpośrednio obiektów tej klasy

abstrakcyjną musi być abstrakcyjna:

• Klasa abstrakcyjna powinna być dziedziczona abstract class Ab{

przez klasy konkretne, które muszą

int n;

abstract int pobierz();

implementować metody abstrakcyjne klasy

void pokaz()

abstrakcyjnej

{ System.out.println(„Klasa abstrakcyjna”);}

}

5

6

1

Przykład 2 – klasa abstrakcyjna

Przykład 2 – klasy konkretne

Zwierz

dziedziczące po klasie Zwierz

abstract class Zwierz {

class Pies extends Zwierz {

String nazwa;

Pies(){}

Zwierz(){nazwa="nieznany";};

Pies(String s){super(s);}

Zwierz(String s){nazwa=s;}

String pobierzTyp() {return "Pies";}

abstract String pobierzTyp() {}

String pobierzGlos(){return "Hau, hau !";}

abstract String pobierzGlos(){}

}

String pobierzNazwe(){return nazwa;}

class Kot extends Zwierz {

void dajGlos(){

Kot(){}

System.out.println(pobierzTyp()+""+pobierzNazwe() Kot(String s){super(s);}

+"mowi:"+dajGlos());}

String pobierzTyp() {return "Kot";}

}

String pobierzGlos(){return "Miau, miau !";}

}

7

8

Przykład 2 - aplikacja

Interfejsy

public class test1{

• ogólnie interfejs klasy – sposób komunikowania się z jej obiektami

• brak wielodziedziczenia w Javie rekompensowany jest za pomocą public static void main(String [ ] args){

specjalnego interfejsu

Kot kot=new Kot();

• specjalny interfejs definiowany za pomocą słowa kluczowego interface to:

Pies pies=new Pies("Nero");

– zestaw abstrakcyjnych metod publicznych

kot.dajGlos();

– oraz ewentualnie stałych statycznych

• implementacja interfejsu w klasie to zdefiniowanie wszystkich pies.dajGlos();

metod interfejsu w tej klasie; to Ŝe klasa implementuje interfejs X

}

oznaczamy za pomocą słowa implements np.: class A implements X {

}

// implementacja wszystkich metod interfejsu X

}

• kaŜda klasa implementująca interfejs musi zdefiniować wszystkie metody interfejsu albo musi być klasą abstrakcyjną 9

10

Przykład 3 – klasa

Przykład 3 - interfejsy

abstrakcyjna

interface Ruch{

abstract class Zwierz {

void start();//metoda abstrakcyjna

String nazwa;

void stop(); //metoda abstrakcyjna

Zwierz(){ nazwa="nieznany";};

}

Zwierz(String s){ nazwa=s;}

interface Glos{

abstract String pobierzTyp();

int CICHO=0;//stałe statyczne (domyślnie final static) abstract void dajGlos(int glos);

int GLOSNO=1;

String pobierzNazwe(){

String pobierzGlos(int glos);//metoda abstrakcyjna return nazwa;

}

}

}

11

12

2

Przykład 3 – klasa konkretna implementująca interfejsy

Przykład 3 - aplikacja

class Pies extends Zwierz implements Glos, Ruch {

Pies(){}

public class test2

Pies(String s){super(s);}

{

String pobierzTyp() {return " Pies";}

public static void main(String [ ] args)

public String pobierzGlos(int glos){

{

if (glos==GLOSNO) return "HAU, HAU..."; Pies pies=new Pies("Nero"); //obiekt pies jest typu Pies else return "hau, hau...";

}

//oraz typu Zwierz, Ruch i Mowa

void dajGlos(int glos){

pies.start();

System.out.println(pobierzGlos(glos)); }

pies.dajGlos(1);

public void start(){

pies.stop();

System.out.println("Pies "+nazwa+" biegnie."); }

}

public void stop(){

}

System.out.println("Pies "+nazwa+" stoi."); }

13

14

}

Konwersje obiektowe w dół

• Wymagają jawnego uŜycia operatora konwersji

• Są bezpieczne (Java w trakcie trakcie wykonania programu wykryje błąd konwersji do niewłaściwego typu tj. do klasy, która nie dziedziczy klasy, z której dokonujemy konwersji)

np.

Pies p=new Pies();

Zwierz z=p;

Pies p1=(Pies) z; //konwersja z typu Zwierz

//do typu Pies

• To samo dotyczy interfejsów (interfejs to teŜ typ) 15

3