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