27
INTERFEJSY I KLASY WEWNĘTRZNE Artur Szwabowicz 140907

INTERFEJSY I KLASY WEWNĘTRZNE

Embed Size (px)

DESCRIPTION

INTERFEJSY I KLASY WEWNĘTRZNE. Artur Szwabowicz 140907. Interfejs. Interfejs jest to spolszczenie angielskiego słowa interface , które na polski bywa tłumaczone jako styk . - PowerPoint PPT Presentation

Citation preview

Page 1: INTERFEJSY  I  KLASY WEWNĘTRZNE

INTERFEJSY I

KLASY WEWNĘTRZNE

Artur Szwabowicz 140907

Page 2: INTERFEJSY  I  KLASY WEWNĘTRZNE

Interfejs

Interfejs jest to spolszczenie angielskiego słowa interface, które na polski bywa tłumaczone jako styk.

• interfejs klasy - w językach obiektowych abstrakcyjna reprezentacja klasy pozwalająca na wykorzystywanie jej bez odwoływania się do konkretnej implementacji,

• interfejs (urządzenie) - urządzenie elektroniczne lub optyczne pozwalające na komunikację między dwoma innymi urządzeniami, których bezpośrednio nie da się ze sobą połączyć,

• interfejs użytkownika - oprogramowanie pozwalające na interakcję między aplikacjami i użytkownikiem: o interfejs graficzny - interfejs użytkownika komunikujący stan programu

w postaci graficznej na ekranie (lub wyświetlaczu), który jako wejście wykorzystuje urządzenie wskazujące (myszkę, touchpad, tablet, joystick, itp.) i klawiaturę,

o interfejs tekstowy - interfejs użytkownika komunikujący stan aplikacji w postaci znaków na ekranie (lub wyświetlaczu), wykorzystujący jako wejście z reguły tylko klawiaturę.

Page 3: INTERFEJSY  I  KLASY WEWNĘTRZNE

Interfejs

Słowo kluczowe interface

Interfejsy Javy rozwiązują problem wielokrotnego dziedziczenia, gdyż zapewniają znaczną część korzyści, jakie w przypadku wielokrotnego dziedziczenia daje możliwość wykorzystania polimorfizmu, a jednocześnie chroni nas przed problemem „śmiertelnego rombu” – wymuszają by wszystkie metody były abstrakcyjne!

Klasa potomna musi zaimplementować wszystkie metody (wszystkie metody abstrakcyjne muszą zostać zaimplementowane w pierwszej konkretnej klasie potomnej).

Interfejs informuje: „Oto jak będą wyglądać wszystkie klasy implementujące mnie.”

Page 4: INTERFEJSY  I  KLASY WEWNĘTRZNE

Interfejs

Rozwiązania wykorzystujące „dwie klasy bazowe” przysparzają tylko jednego problemu...

Nosi ono nazwę „wielokrotnego dziedziczenia” i może być naprawdę niebezpieczne.

To znaczy – mogłoby być – gdyby tylko można je było wykorzystać w Javie.

Jednak nie jest, gdyż wielokrotne dziedziczenie może doprowadzić do powstania problemu nazywanego „śmiertelnym rombem”.

a

Obie klasy – NagrywarkaCD oraz

NagrywarkaDVD dziedziczą po klasie NagrywarkaCyfrowa i obie przesłaniają metodę zapisz(). Obie dziedziczą także składową i

typu int.

Oto problem, jakiego przysparza wielokrotne

dziedziczenie. Która z metod zapisz()

zostanie wywołana w przypadku wywołania tej metody dla obiektu

NapedCombo?

Page 5: INTERFEJSY  I  KLASY WEWNĘTRZNE

InterfejsW drzewie

dziedziczenie zwierząt, klasy

Zwierze, Psowate i Kotowate zdefiniowano

jako klasy abstrakcyjne, a

„liście” tego drzewa są klasami

konkretnymi.

Ale, co zrobić aby klasy Pies i Kot mogły wykonywać czynności charakterystyczne dla klasy ZwierzakDomowy.

Page 6: INTERFEJSY  I  KLASY WEWNĘTRZNE

Interfejs

Można umieścić wszystkie

metody klasy ZwierzakDomowy w

klasie Zwierze

Page 7: INTERFEJSY  I  KLASY WEWNĘTRZNE

Interfejs

Można umieścić wszystkie metody

klasy ZwierzakDomowy w klasie Zwierze,

lecz zadeklarować je jako metody

abstrakcyjne.

Page 8: INTERFEJSY  I  KLASY WEWNĘTRZNE

Interfejs

Można umieścić metody

charakterystyczne dla zwierzaków

domowych wyłącznie w klasach, w jakich

powinny się znaleźć.

Page 9: INTERFEJSY  I  KLASY WEWNĘTRZNE

Interfejs

Na pomoc spieszą

interfejsy.

Wygląda na to, że na samej górze

hierarchii dziedziczenia potrzebujemy DWÓCH klas.

Page 10: INTERFEJSY  I  KLASY WEWNĘTRZNE

Interfejs

Na pomoc spieszą

interfejsy.

Page 11: INTERFEJSY  I  KLASY WEWNĘTRZNE

Interfejs

Interfejs przypomina całkowicie abstrakcyjną klasę.

Wszytkie metody wchodzące w skłąd

interfejsu są abstrakcyjne, zatem wszystkie klasy,

które spełniają relację JEST z interfejsem, MUSZĄ te metody implementować

(czyli przesłaniać).

Aby ZDEFINIOWAĆ interfejs:

public interface ZwierzakDomowy {...}

Aby ZAIMPLEMENTOWAĆ interfejs: public class Pies extends Psowate implements ZwierzakDomowy {...}

Zamiast słowa kluczowego

„class” należy użyć słowa „interface”.

Page 12: INTERFEJSY  I  KLASY WEWNĘTRZNE

Interfejs

public interface ZwierzakDomowy {

public abstract void badzMilutki();

public abstract void bawSie();

}

public class Pies extends Psowate implements ZwierzakDomowy {

public void badzMilutki() {...}

public void bawSie() {...}

public void wedruj() {...}

public void jedz() {...}

}

Skoro chce być zwierzakiem

domowym, zatem musi

zaimplementować metody tworzące

interfejs ZwierzakDomowy.

A to są zwyczajnie

przysłaniane metody klasy

Zwierze.

Page 13: INTERFEJSY  I  KLASY WEWNĘTRZNE

Interfejs Ten sam interfejs mogą

implementować klasy pochodzące z różnych drzew dziedziczenia.

Page 14: INTERFEJSY  I  KLASY WEWNĘTRZNE

Interfejs

Każde pole umieszczone w interfejsie staje się automatycznie statyczne i finalne.

// Użycie interfejsów do grupowania stałych.

public interface Miesiace {

int

JANUARY = 1, FEBRUARY = 2, MARCH = 3,

APRIL = 4, MAY = 5, JUNE = 6, JULY = 7,

AUGUST = 8, SEPTEMBER = 9, OCTOBER = 10,

NOVEMBER = 11, DECEMBER = 12;

}

Wyrażenie Miesiace.MAY zwróci wartość typu int równą 5.

W Javie przyjęto zwyczaj stosowania wyłącznie wielkich liter w nazwach pól typu static final, posiadających stałe wartości inicjalizujące.

Page 15: INTERFEJSY  I  KLASY WEWNĘTRZNE

Interfejs

Klasa może implementować więcej niż jeden interfejs. Wszystkie nazwy interfejsów umieszczamy po słowie implements i rozdzielamy przecinkami.

W następnym przykładzie pokazano, iż:– można połączyć klasę konkretną z kilkoma interfejsami w celu

stworzenia nowej klasy– po interfejsach można dziedziczyć – otrzymujemy wtedy kolejny

interfejs

Page 16: INTERFEJSY  I  KLASY WEWNĘTRZNE

Interfejs

// Wiele interfejsów.

interface CanFight {

void fight();

}

interface CanSwim {

void swim();

}

interface CanFly {

void fly();

}

class ActionCharacter {

public void fight() { }

}

class Hero extends ActionCharacter implements CanFight, CanSwim, CanFly { public void swim() { } public void fly() { }}

public class Adventure { public static void t(CanFight x) { x.fight(); } public static void u(CanSwim x) { x.swim(); } public static void v(CanFly x) { x.fly(); } public static void w(ActionCharacter x)

{ x.fight(); } public static void main(String[] args) { Hero h = new Hero(); t(h); // Obiekt Hero jako CanFight u(h); // Obiekt Hero jako CanSwim v(h); // Obiekt Hero jako CanFly w(h); // Obiekt Hero jako ActionCharacter }}

Klasa Hero dziedziczy po

ActionCharacter, dlatego nie

implementuje metody fight().

W klasie Adventure występują cztery

metody pobierające jako argumenty różne

interfejsy oraz klasę konkretną

Obiekt Hero może być przekazywany do wszystkich tych metod, co oznacza,

że możliwe jest rzutowanie na

każdy z interfejsów.

Page 17: INTERFEJSY  I  KLASY WEWNĘTRZNE

Interfejs

Po co są interfejsy?

Dają nam możliwość rzutowania na kilka typów bazowych.

Uniemożliwiają programiście tworzenie obiektów naszej klasy.

Page 18: INTERFEJSY  I  KLASY WEWNĘTRZNE

Interfejs

Kiedy powinniśmy stosować interfejsy a kiedy klasy abstrakcyjne?

Interfejs daje nam korzyści zapewniane przez abstrakcyjność klas oraz dodatkowe – wynikające z bycia interfejsem.

Jeżeli możliwe jest stworzenie klasy bazowej bez definiowania żadnych metod lub zmiennych składowych, powinniśmy zawsze wybierać interfejsy, a nie klasy abstrakcyjne.

Page 19: INTERFEJSY  I  KLASY WEWNĘTRZNE

Klasy wewnętrzne

Możliwe jest umieszczenie definicji klasy wewnątrz innej definicji klasy.

Klasy wewnętrzne umożliwiają grupowanie logicznie powiązanych ze sobą klas i kontrolowanie widoczności jednych w drugich.

Page 20: INTERFEJSY  I  KLASY WEWNĘTRZNE

Klasy wewnętrzne

Aby utworzyć klasę wewnętrzną, należy upewnić się, że definicja klasy wewnętrznej znajduje się wewnątrz nawiasów

klamrowych klasy zewnętrznej.

class MojaKlasaZewnetrzna

{

class MojaKlasaWewnetrzna

{

void doDziela() {...}

}

}

Page 21: INTERFEJSY  I  KLASY WEWNĘTRZNE

Klasy wewnętrzne

Klasa wewnętrzna może używać wszystkich składowych i metod klasy zewnętrznej, nawet tych prywatnych.

Klasa wewnętrzna może się posługiwać składowymi i metodami klasy zewnętrznej jak gdyby były zadeklarowane w niej samej.

Page 22: INTERFEJSY  I  KLASY WEWNĘTRZNE

Klasy wewnętrzne

Obiekt klasy wewnętrznej musi być związany z konkretnym obiektem klasy zewnętrznej przechowywanym na stercie.

Obiekt wewnętrzny oraz zewnętrzny są ze sobą powiązane w szczególny sposób.

1. Utwórz obiekt klasy zewnętrznej.

2. Utwórz obiekt klasy wewnętrznej używając przy tym obiektu klasy zewnętrznej.

3. Teraz obiekt klasy zewnętrznej oraz obiekt klasy wewnętrznej są ze sobą połączone w szczególny sposób.

Te dwa obiekty przebywające na

stercie łączy szczególna więź.

Obiekt wewnętrzny może

korzystać ze składowych

obiektu zewnętrznego (i

na odwrót).

Page 23: INTERFEJSY  I  KLASY WEWNĘTRZNE

Klasy wewnętrzne

class MojaKlasaZewnetrzna

{

private int x;

MojaKlasaWewnetrzna wew = new MojaKlasaWewnetrzna();

public void zrobCos()

{

wew.doRoboty();

}

class MojaKlasaWewnetrzna

{

void doRoboty()

{

x = 42;

}

}

}

Wywołanie metody klasy wewnętrznej

Utworzenie obiektu klasy wewnętrznej

Klasa zewnętrzna ma składową prywatną o nazwie „x”

Metoda klasy wewnętrznej

używa składowej „x” klasy

zewnętrznej

Klasa zewnętrzna ma składową prywatną o nazwie „x”

Page 24: INTERFEJSY  I  KLASY WEWNĘTRZNE

Klasy wewnętrzne

Istnieje możliwość utworzenia obiektu klasy wewnętrznej z poziomu kodu działającego poza klasą zewnętrzną, jednak należy w tym celu

użyć specjalnej składni.

class Tmp

{

public static void main(String[] args)

{

KlasaZewnetrzna objZew = new KlasaZewnetrzna();

KlasaZewnetrzna.KlasaWewnetrzna objWew = objZew.new KlasaWewnetrzna();

}

}

Page 25: INTERFEJSY  I  KLASY WEWNĘTRZNE

Klasy wewnętrzne

Nasze programy mogą zawierać:

1. Klasę zdefiniowaną wewnątrz metody.2. Klasę zdefiniowaną wewnątrz zasięgu określonego w

metodzie.3. Anonimową klasę implementującą interfejs.4. Anonimową klasę rozszerzającą klasę posiadającą

konstruktor inny od domyślnego.5. Anonimową klasę przeprowadzającą inicjalizację pól.6. Anonimową klasę przeprowadzającą konstrukcje zawierającą

inicjalizacje instancji (anonimowe klasy wewnętrzne nie mogą mieć konstruktorów).

Page 26: INTERFEJSY  I  KLASY WEWNĘTRZNE

Klasy wewnętrzne

Co sprawia, że klasy wewnętrzne są ważne?

Dają nam możliwość kilkukrotnego zaimplementowania tego samego interfejsu w jednej klasie.

Należy pamiętać, ze w normalnej klasie Javy nie można zaimplementować metody więcej niż jeden raz. Jednak stosując klasy wewnętrzne, każda z nich może implementować ten sam interfejs, dzięki czemu można stworzyć różne implementacje tej samej metody interfejsu.

Page 27: INTERFEJSY  I  KLASY WEWNĘTRZNE

Interfejsy i klasy wewnętrzne

Dziękuję za uwagę

Artur Szwabowicz