background image

2. Klasa, obiekt, interfejs, pakiet 

W. Kasprzak: Programowanie zdarzeniowe 

2 - 1 

 

2. Klasa, obiekt, interfejs, pakiet 

 

1.  Definicja klasy  

2.  Cykl 

Ŝ

ycia obiektu 

3.  Kapsułkowanie dost

ę

pu do składowych 

4.  Dziedziczenie klas 

5.  Klasy zagnie

Ŝ

d

Ŝ

one 

6.  Interfejs 

7.  Pakiet 

 

2. Klasa, obiekt, interfejs, pakiet 

W. Kasprzak: Programowanie zdarzeniowe 

2 - 2 

Cechy programowania obiektowego (przypomnienie) 

 

Klasa - implementacja abstrakcyjnego typu danych - prototyp obiektów 

pewnego typu - wyznacza strukturę danych i operacji dla tych obiektów. 

 

Obiekt  -  instancja  klasy  -  związek  zmiennych  (pól)  i  funkcji 

składowych (metod). 

 

Komunikowanie się obiektów - obiekt wykonuje wymaganą metodę na 

przekazanych mu argumentach. 

 

Dziedziczenie  -  klasa  pochodna  dziedziczy  strukturę  danych  i 

zachowanie ze swojej klasy bazowej ("nadklasy"). 

 

Metody polimorficzne  –  róŜne wersje  metody w klasach  pochodnych, 

dynamiczne wiązanie wersji metody. 

 

Kapsłkowanie – poziomy dostępu do składowych klasy. 

 

Interfejs - jest to kontrakt (model zachowania obiektu) w postaci zbioru 

metod  i  deklaracji  stałych  -  jeśli  dana  klasa  implementuje  interfejs  to 
"zobowiązuje  się"  do  implementacji  wszystkich  metod  deklarowanych 
w tym interfejsie. 

background image

2. Klasa, obiekt, interfejs, pakiet 

W. Kasprzak: Programowanie zdarzeniowe 

2 - 3 

2.1 Definicja klasy 

Przykład 2.1

. Klasa implementująca stos (kolejkę LIFO). 

 

2. Klasa, obiekt, interfejs, pakiet 

W. Kasprzak: Programowanie zdarzeniowe 

2 - 4 

W definicji klasy Stack wykorzystano obiekt klasy Vector - tablicy obiektów 
o zmiennej liczbie elementow. 
 

Definicja klasy składa si

ę

 z: 



 

deklaracji  klasy  (podaje  nazwę  klasy,  specyfikację  dostępu  i  ew. 
dziedziczenie) 



 

treści (definicji) klasy. 

 

Deklaracja klasy 

Obligatoryjne

 są: słowo kluczowe 

class

 i 

nazwaKlasy.

 

 
Dla 

opcjonalnych

 części moŜliwe są domyślne specyfikacje: 



 

klasa niepubliczna, 



 

klasa konkretna (nieabstrakcyjna), 



 

klasa nie-finalna (moŜe istnieć jej klasa pochodna) 



 

będąca klasą pochodną klasy Object



 

klasą nie implementującą interfejsów. 

 

background image

2. Klasa, obiekt, interfejs, pakiet 

W. Kasprzak: Programowanie zdarzeniowe 

2 - 5 



 

public  - klasa jest dostępna dla wszystkich klas; w przeciwnym razie tylko 
dla klas z tego samego pakietu. 



 

abstract - nie mogą istnieć instancje tej klasy. 



 

final - nie moŜna dziedziczyć tej klasy. 



 

extends Super  - określa, Ŝe klasa Super jest klasą bazową.  



 

implements  Interfaces    -  okresla,  Ŝe  klasa  implementuje  jeden  lub  więcej 
interfejsów (podawanych po przecinku). 

 

Tre

ść

 klasy 

Ujęta w parę nawiasów { , } , zawiera: 


 

deklaracje wszystkich zmiennych składowych (pól) (w tym pól "obiektów" i 
pól statycznych - "klasowych"); 



 

deklaracje i definicje wszystkich funkcji składowych (metod) (w tym metod 
wywoływanych na rzecz obiektu lub metod statycznych - "klasowych"); 



 

ewentualnie definicje 1-go lub więcej konstruktorów. 

 

Np. 

klasa  Stack  w  przykładzie  2.1  zawiera  pole  items  klasy  Vector  ,  jeden 

konstruktor bezargumentowy i 3 metody - pushpopisEmpty.  

2. Klasa, obiekt, interfejs, pakiet 

W. Kasprzak: Programowanie zdarzeniowe 

2 - 6 

Konstruktory  

Przykład 2.2

. Utwórzmy dwa konstruktory w klasie 

Stack

public Stack() { 

// 1-szy konstruktor

 

    items = new Vector(10);  

public Stack(int initialSize) { 

// 2-gi konstruktor 

    items = new Vector(initialSize); 

Wywołania obu konstruktorów: 

new Stack(10); 

// 2-giego 

new Stack(); 

// 1-szego 

 
Domyślny  konstruktor  (o  pustym  kodzie  inicjalizaci)  jest  dostępny 
automatycznie wtedy, gdy w klasie nie zdefiniowano 

Ŝ

adnego

 konstruktora.  

 
Konstruktor w klasie dziedziczonej  
 

Przykład 2.3.

 Wywołanie konstruktora klasy bazowej w klasie pochodnej. 

background image

2. Klasa, obiekt, interfejs, pakiet 

W. Kasprzak: Programowanie zdarzeniowe 

2 - 7 

class AnimationThread extends Thread {  

// Dziedziczenie po Thread 

    int framesPerSecond; 
    int numImages; 
    Image[] images; 
    AnimationThread(int fps, int num) { 

// Definicja konstruktora 

 

        super("AnimThread"); 

// Wywołanie konstruktora klasy bazowej - 

// jeśli występuje, to powinno być pierwszą instrukcją w 
// konstruktorze klasy pochodnej. 

        this.framesPerSecond = fps; 
        this.numImages = num; 
        this.images = new Image[numImages]; 
        for (int i = 0; i <= numImages; i++) { 
            . . . 

            // Załaduj obrazy. 

            . . . 
        } 
    }   
                              . . . 

2. Klasa, obiekt, interfejs, pakiet 

W. Kasprzak: Programowanie zdarzeniowe 

2 - 8 

Kwalifikatory dost

ę

pu

, które mogą być podane w deklaracji konstruktora: 



 

private  -  Ŝadna  inna  klasa  nie  moŜe  tworzyć  (bezpośrednio)  obiektów  tej 
klasy; 



 

protected  -  klasy  pochodne  danej  klasy  i  klasy  naleŜące  do  tego  samego 
pakietu mogą tworzyć obiekty tej klasy. 



 

public - kaŜda klasa moŜe tworzyć obiekty naszej klasy. 



 

brak specyfikatora dostępu - kaŜda klasa z tego 

samego pakietu

 moŜe tworzyć 

obiekty tej klasy. 

 
Deklaracje pól klasy 

deklaracjaKlasy { 
    deklaracje pól 
    deklaracje i definicje metod 

 
Np. w klasie Stack . 

private Vector items; 

Specyfikuje prywatny dostęp do składowej.  
 

background image

2. Klasa, obiekt, interfejs, pakiet 

W. Kasprzak: Programowanie zdarzeniowe 

2 - 9 

W deklaracji pola mogą wystąpic teŜ 

inne specyfikatory: 

 



 

Poziomy dostępu:  

public, protected, package, private 



 

static - deklaracja pola 

statycznego

 (lub metody statycznej). 



 

final  - deklaracja 

stałego

 pola.  



 

transient - zaznacza te składowe, które nie powinny być serializowane



 

volatile - zaznacza pole jako ulotne, mające nie podlegać optymalizacji. 

 

Uwaga:

 pole i metoda jednej klasy mogą mieć 

tę samą

 nazwę.  

 

Przykład 2.4.

 

public class Stack { 
    private Vector items;      

// Nazwa pola items 

    public Vector items() {  

// Nazwa metody items 

         . . . 
    } 

2. Klasa, obiekt, interfejs, pakiet 

W. Kasprzak: Programowanie zdarzeniowe 

2 - 10 

Definiowanie metod w klasie 

Przykład 2.5. 

Metoda push w klasie Stack

 

 

Deklaracja  metody

  -  specyfikacja  poziomu  dostępu,  typ  wyniku,  nazwa, 

lista parametrów (argumentów formalnych).  

 

 
Obligatoryjne

 części deklaracji to: 

typWyniku   nazwaMetody ()  

background image

2. Klasa, obiekt, interfejs, pakiet 

W. Kasprzak: Programowanie zdarzeniowe 

2 - 11 

Wszystkie elementy deklaracji metody: 



 

accessLevel - poziom dostępu - public, protectedpackageprivate.  



 

static - deklaruje metodę jako statyczną ("klasową"). 



 

abstract - nie posiada defincji, jej klasa musi być abstrakcyjna. 



 

final - nie moŜe być przysłonieta przez metody klas pochodnych. 



 

native - metoda rodzima, napisana w innym języku programowania. 



 

synchronized - synchronicznie wywoływana metoda względem wielu 
wątków. 



 

returnType - typ zwracanego wyniku. 



 

methodName - nazwa metody - dowolny legalny identyfikator. 



 

paramlist ) - lista parametrów. 



 

[throws exceptions] - lista wyjątków zgłaszanych przez metodę. 

 

2. Klasa, obiekt, interfejs, pakiet 

W. Kasprzak: Programowanie zdarzeniowe 

2 - 12 

Tre

ść

 definicji metody 

Wynik  zwracany  przez  metodę

  -  jeśli  zadeklarowano  wynik  zwracany  przez 

metodę  (róŜny  od  void)  to  musi  w  jej  definicji  wystąpić  instrukcja  return 
zwracająca zmienną lub obiekt zgodnego typu.  
MoŜna zwrócić: 

 

zmienną typu prostego - 

przez wartość

 -  

 

lub obiekt klasy - 

przez referencję

 

Przykład 2.6 

public synchronized Object pop() { 
    int len = items.size(); 
    Object obj = null; 
    if (len == 0) 
        throw new EmptyStackException(); 
    obj = items.elementAt(len - 1); 
    items.removeElementAt(len - 1); 
    return obj; 

background image

2. Klasa, obiekt, interfejs, pakiet 

W. Kasprzak: Programowanie zdarzeniowe 

2 - 13 

 

Metoda  moŜe  zwrócić  obiekt  typu  klasy  pochodnej

  względem  klasy 

zadeklarowanego wyniku. 

 

Przykład 2.7

. Niech istnieje hierarchia klas:  

Object  <-- Number  <-- ImaginaryNumber 

Niech deklarowany typ wyniku metody to 

Number

:  

public Number returnANumber() { 
    . . . 

Metoda moŜe teŜ zwrócić obiekt klasy 

ImaginaryNumber

 lecz nie klasy 

Object

.  

 
Przeci
ąŜona nazwa metody

  

metody przeciąŜone róŜnią się 

liczbą

 lub 

typem parametrów

Przesłanianie metod

  

metoda w klasie pochodnej moŜe przesłonić metodę jej klasy bazowej - obie 
muszą mieć 

ten sam typ wyniku, nazwę i listę parametrów

Parametry metody: 

 typy proste, tablice, typy obiektowe.  

Nie moŜna przekazywać 

metod jako parametrów

2. Klasa, obiekt, interfejs, pakiet 

W. Kasprzak: Programowanie zdarzeniowe 

2 - 14 

Nazwy  parametrów  metody  muszą  być  unikalne  w  ramach  jednej  metody  a 
takŜe nazw parametrów frazy 

catch

 zdefiniowanej w danej metodzie. 

 
Przekazywanie przez wartość 
Zmienne proste są kopiowane a zmienne referencyjne teŜ (ale nie obiekty przez 
nie referowane).  
Zmienna prosta ani teŜ zmienna referencyjna nie mogą być modyfikowane, ale 
obiekt referowany - moŜe. 
 
W tre
ści definicji metody moŜliwe są odwołania:  
-

 

this

 - odwołanie do danego obiektu; 

-

 

super

 - odwołanie do składowych pod-obiektu klasy bazowej. 

Lokalne zmienne metody - zmienne deklarowane w treści metody są lokalne - 
widoczne tylko w zasięgu wewnętrznym tej metody.  
Np. 

Object findObjectInArray(Object o, Object[] arrayOfObjects) { 
    int i; 

     

// lokalna zmienna

 

 ... 

background image

2. Klasa, obiekt, interfejs, pakiet 

W. Kasprzak: Programowanie zdarzeniowe 

2 - 15 

2.2 Cykl 

Ŝ

ycia obiektu 

Instrukcja definicji obiektu

 posiada 3 części: 

1.

 

Definicja zmiennej typu 

referencji do obiektu klasy.

 

2.

 

Utworzenie obiektu: operator new alokuje pamięć dla obiektu. 

3.

 

Inicjalizacja: wywołanie konstruktora klasy.  



 

Definicja zmiennej: 

typ nazwa 

Dla typu klasy lub interfejsu zmienna przechowuje adres do obiektu klasy, ale 
nie  jest  on  dostępny  bezpośrednio  lecz  stanowi  referencję.  Do  momentu 
przypisania jej adresu obiektu przechowuje ona zerową referencję. 


 

Utworzenie obiektu:  

new typ(argumenty

Operator new zwraca referencję do nowo utworzonego obiektu. 


 

Inicjalizacja obiektu: w konstruktorze klasy. 

Przykład 2.8 

public class Point { 
    public int x = 0;   
    public int y = 0; 

2. Klasa, obiekt, interfejs, pakiet 

W. Kasprzak: Programowanie zdarzeniowe 

2 - 16 

    public Point(int x, int y) {  

// Konstruktor 

        this.x = x;    
        this.y = y; 
    }
 

Dla zupełności definicja klasy Rectangle korzystającej z klasy Point: 

public class Rectangle { 
    public int width = 0;   
    public int height = 0; 
    public Point origin; 

// ... 

    public Rectangle(int w, int h) { 
        this(new Point(0, 0), w, h); 
    } 
    public Rectangle(Point p, int w, int h) { 
        origin = p;         
        width = w;  
        height = h; 
    } 

background image

2. Klasa, obiekt, interfejs, pakiet 

W. Kasprzak: Programowanie zdarzeniowe 

2 - 17 

    public void move(int x, int y) { 
        origin.x = x;   
        origin.y = y; 
    } 
    public int area() { 
        return width * height; 
    } 

 

Przykład 2.9.

 Zmienna referencyjna a obiekt klasy: 

Point origin_one = new Point(23, 94); 

 

 
Rectangle rect_one = new Rectangle(origin_one, 100, 200); 

2. Klasa, obiekt, interfejs, pakiet 

W. Kasprzak: Programowanie zdarzeniowe 

2 - 18 

 

background image

2. Klasa, obiekt, interfejs, pakiet 

W. Kasprzak: Programowanie zdarzeniowe 

2 - 19 

Co moŜemy robić z obiektem? 



 

Odczytać jego stan - pobrać wartości jego pól.  



 

Zmienić stan obiektu - zmienić wartości pól obiektu. 



 

Wykonać akcję - wywołać metodę dla obiektu. 

 
Dostęp do pola obiektu:  
Nazwa kwalifikowana: 

referencjaObiektu.nazwa Pola 

Zwykle  posługujemy  się  nazwaną  referencją,  ale  moŜe  teŜ  być  nienazwana 
referencja, np.: 

int height = new Rectangle().height;

 // MoŜliwe ale nieefektywne 

 
Ukrywanie dostępu do pól  
Np.  w  klasie  Rectangle  zdefiniujemy  metody  setWidth,  setHeight,  getWidth
getHeight dla zapisu i odczytu wartości pól obiektu, co umoŜliwia: 


 

sprawdzanie poprawności przekazywanych danych, 



 

uniezaleŜnia uŜytkownika od typu i nazwy pola. 

2. Klasa, obiekt, interfejs, pakiet 

W. Kasprzak: Programowanie zdarzeniowe 

2 - 20 

Wywołania metody 

referencjaDoObiektu.nazwaMetody(listaArgumentów); 
referencjaDoObiektu.nazwaMetody(); 

Np. 

System.out.println("Powierzchnia rect_one: " + rect_one.area()); 
rect_two.move(40, 72); 

 
Usuwanie obiektu - "Garbage Collector" 
Ś

rodowisko  wykonania  Javy  (JRE)  usuwa  samoczynnie  obiekt,  gdy  wykrywa, 

Ŝ

e  nie  jest  juŜ  dłuŜej  uŜywany  w  programie  -  garbage  collection  -  brak 

referencji do tego obiektu w programie. 
"Garbage collector" jest wykonywany automatycznie co pewien czas. MoŜna go 
teŜ wywołać jawnie: 

System.gc() 

 
Metoda "finalize" (znana od klasy Object - nadklasie wszystkich klas) 
Przed  usunięciem  obiektu  przez  GC  wywoływana  jest  metoda  finalize,  dając 
programiście  szansę  do zdefiniowania  czynności  "czyszczących"  związanych  z 
usunięciem obiektu.  

background image

2. Klasa, obiekt, interfejs, pakiet 

W. Kasprzak: Programowanie zdarzeniowe 

2 - 21 

2.3 Poziomy dost

ę

pu do składowych klasy 

Cztery  poziomy  dostępu: 

private,  protected,  public

  i  (jeśli  niezdefiniowane) 

package.

  

Uwaga: Java 1 posiadała jeszcze jeden specyfikator dostępu - 

private protected

Nie występuje on w Java 2. 
 

Specyfikator 

klasa 

klasa 

pochodna 

ten pakiet 

pozostałe 

klasy 

private 

 

 

 

protected 

X* 

 

public 

package 

 

 

 
Uwaga:
 

(*)

  składowe 

protected

  są  dostępne  dla  klasy  pochodnej, 

zdefiniowanej w innym pakiecie niŜ klasa bazowa, tylko wtedy, gdy odwołania 
następują dla obiektu tej klasy a nie klasy bazowej. 
 

Private.

 Np. niech pewna klasa Alpha zawiera prywatne składowe: 

2. Klasa, obiekt, interfejs, pakiet 

W. Kasprzak: Programowanie zdarzeniowe 

2 - 22 

class Alpha {      private int iamprivate
       

 

 

 

private void privateMethod()  

{ System.out.println("privateMethod"); } 

Tylko  obiekty  klasy  Alpha  mogą  odwoływać  się  do  pola  iamprivate  i 
wywoływać metodę privateMethod. Beta - inna klasa w tym samym pakiecie: 

class Beta {    void accessMethod() { 
           

 

 

Alpha a = new Alpha(); 

           

 

 

a.iamprivate = 10;      

// niedozwolone 

           

 

 

a.privateMethod();      

// niedozwolone 

       

 

 

 

Obiekty  pewnej  klasy  mogą  oczywiście  odwoływać  się  do  prywatnych 
składowych innego obiektu tej samej klasy. Np. 

class Alpha {   private int iamprivate
        boolean isEqualTo (Alpha anotherAlpha) { 
            if (this.iamprivate 

== 

anotherAlpha.iamprivate)   return true; 

            else   return false;  } 

background image

2. Klasa, obiekt, interfejs, pakiet 

W. Kasprzak: Programowanie zdarzeniowe 

2 - 23 

Protected 

-  dostęp  mają:  klasa,  jej  klasa  pochodna  i  wszystkie  klasy  naleŜące 

do tego samego pakietu co omawiana klasa. Np. 

package Greek; 

public class Alpha { protected int iamprotected
       

 

 

 

 

protected void protectedMethod() { 

                                         System.out.println("protectedMethod"); } 

Niech klasa Delta będzie klasą pochodną od Alpha ale zdefiniowaną w innym 
pakiecie Latin. 

package Latin; 
import Greek.*; 
class Delta extends Alpha { 
    void accessMethod(Alpha a, Delta d) { 
        a.iamprotected = 10;    

// niedozowolone

 

        d.iamprotected = 10;    

// dozwolone

 

        a.protectedMethod();    

// niedozwolone

 

        d.protectedMethod();    

// dozwolone

 

    } 

2. Klasa, obiekt, interfejs, pakiet 

W. Kasprzak: Programowanie zdarzeniowe 

2 - 24 

Składowe statyczne klasy 

Np. 

class MojaKlasa { 
    float zmFloat; 

// Pole powielane w obiektach klasy 

    static float zmKlasowa; 

// Pole statyczne - unikalne dla obiektów klasy

  

Dostęp do składowej statycznej - przez nazwę klasy lub dowolny jej obiekt. 
Po napotkaniu definicji klasy tworzona jest 

jedyna kopia pola statycznego

 
Metoda statyczna
 nie uzyskuje referencji this

Metoda statyczna

 moŜe odwoływać się jedynie 

do pól statycznych

 tej klasy. 

 
Składowe statyczne
 są dostępne poprzez nazwę klasy, nie ma nawet potrzeby 
definiowania obiektów klasy. Np.: 

KlasaX.ustawX(1); 
System.out.println("KlasaX.x = " + KlasaX.x()); 

 

background image

2. Klasa, obiekt, interfejs, pakiet 

W. Kasprzak: Programowanie zdarzeniowe 

2 - 25 

Inicjalizacja pól 

Składowe zwykłe i statyczne 

mogą być inicjalizowane

 w miejscu deklaracji.  

Np.:  

class KlasaBaB { 
    static final int MAX_POKOJE = 10; 
    boolean zajety = false; 

 
Ograniczenia: 

-

 

Inicjalizacja musi dac się wyrazić wyraŜeniem przypisania. 

-

 

Nie  moŜna  wywołać  w  tym  celu  metody  mogącej  zgłosić  obsługiwany 
wyjątek.  

-

 

Jeśli  podczas  inicjalizacji  wołana  jest  metoda,  która  zgłosi  wyjątek,  to  nie 
jest moŜliwy powrót do programu.  

2. Klasa, obiekt, interfejs, pakiet 

W. Kasprzak: Programowanie zdarzeniowe 

2 - 26 

Inicjalizacja  składowej  statycznej

  w  innym  miejscu  niŜ  miejsce  deklaracji 

składowej wymaga bloku statycznej inicjalizacji.  

static { 

// Kod inicjalizacji 

Przykład 2.10

. Blok statycznej inicjalizacji

import java.util.ResourceBundle; 
class Errors {    
    static ResourceBundle errorStrings; 

// Deklaracja bez inicjalizacji 

    static { 
         try {  errorStrings = ResourceBundle.getBundle("ErrorStrings"); 
         }  
         catch (java.util.MissingResourceException e) { 

              // obsługa wyjątku i wznowienie wykonania programu  

          } 
     

Podczas  inicjalizacji  (w  bloku  try)  moŜe  powstać  błąd  (nie  ma  wiązki),  ale 
będzie moŜliwe jego obsłuŜenie i kontynuacja wykonywania programu.  

background image

2. Klasa, obiekt, interfejs, pakiet 

W. Kasprzak: Programowanie zdarzeniowe 

2 - 27 

Liczba bloków statycznej inicjalizacji w programie jest dowolna. 

 
Inicjalizacja zwykłej składowej

 powinna odbyć się w konstruktorze klasy. 

Przykład 2.11

. Inicjalizacja składowych obiektu w konstruktorze

import java.util.ResourceBundle; 
class Errors { 
    ResourceBundle errorStrings; 

// Deklaracja. Inicjalizacja w konstruktorze 

    Errors() { 
        try {  errorStrings = ResourceBundle.getBundle("ErrorStrings"); 
        }  
        catch (java.util.MissingResourceException e) { 

            // obsługa wyjątku i wznowienie wykonania programu  

        } 
    } 

Bloki inicjalizacji instancji 

Klasy  anonimowe  nie  posiadają  konstruktorów  -  w  celu  inicjalizacji 
składowych obiektowych istnieje mechanizm bloku inicjalizacji instancji. 

2. Klasa, obiekt, interfejs, pakiet 

W. Kasprzak: Programowanie zdarzeniowe 

2 - 28 

2.4 Dziedziczenie klas 

extends  identyfikuje  dziedziczenie  -  dziedziczenie  pojedyncze  -  tylko  jedna 
klasa bazowa w dziedziczeniu. 
Przy  braku  dziedziczenia  nasza  klasa  dziedziczy  domyślnie  z  klasy  Object 
zdefiniowanej w java.lang.  
 



 

Klasa pochodna dziedziczy: 

-

 

wszystkie  składowe,  które  są  dostępne  dla  niej  (public  lub  protected  lub 
package - jeśli klasa naleŜy do tego samego pakietu co jej klasa bazowa) i  

-

 

których nie przesłania (pola) lub nie nadpisuje (metody); 

Konstruktorów nie dziedziczy się. 
 
Nadpisana metoda moŜe mieć 

inną listę wyjątków

 niŜ metoda dziedziczona, ale 

nie zawiera nazw nie występujących na liście wyjątków metody dziedziczonej. 
 
Specyfikator  dostępu  do  metody  nadpisanej 

moŜe  zezwolić  na  większy  dostęp

 

niŜ metoda dziedziczona ale nie na mniejszy. Np. metoda chroniona (protected) 
w klasie bazowej moŜe zostać publiczna ale nie prywatna. 

background image

2. Klasa, obiekt, interfejs, pakiet 

W. Kasprzak: Programowanie zdarzeniowe 

2 - 29 

Wywołanie metody dziedziczonej  

super.nazwaMetody(); 

 


 

Metody klasy bazowej, 

których nie moŜna

 nadpisać w klasie pochodnej: 

-

 

metoda zadeklarowana jako final w klasie bazowej; 

-

 

metoda statyczna (moŜna jedynie ukryć metodę statyczną dziedziczoną 
przez jej ponowne zadeklarowanie). 

 


 

Metody klasy bazowej 

które muszą

 zostać nadpisane w klasie pochodnej: 

-

 

metody zadeklarowane jako abstrakcyjne w klasie bazowej, 

-

 

lub gdy klasa bazowa jest abstrakcyjna

 

2. Klasa, obiekt, interfejs, pakiet 

W. Kasprzak: Programowanie zdarzeniowe 

2 - 30 

Dziedziczenie po klasie

 Object 

– 

głównej klasie hierarchii klas 

Metody klasy Object, które mogą być nadpisane w naszej klasie: 

-

 

clone  

-

 

equals/hashCode  

-

 

finalize  

-

 

toString  

Nie mogą być nadpisane metody podane jako "

final

" : 

-

 

getClass  

-

 

notify  

-

 

notifyAll  

-

 

wait  

 


 

Metoda 

clone

 - tworzenie nowego obiektu na podstawie juŜ istniejącego: 

obiektKlonowany.clone(); 

Klasa  obiektu  musi  implementować  interfejs 

Cloneable

  -  w  przeciwnym  razie 

powstanie wyjątek typu 

CloneNotSupportedException

 . 

 

Przykład 2.12.

 Implementacja metody clone0 w klasie Stack

background image

2. Klasa, obiekt, interfejs, pakiet 

W. Kasprzak: Programowanie zdarzeniowe 

2 - 31 

public class Stack implements Cloneable 
{  private Vector items; 
    // ...  
    protected Object clone() { 
        try {  Stack s = (Stack)super.clone(); 

// Klonuj obiekt klasy Stack

 

                 s.items = (Vector)items.clone(); 

// Klonuj obiekt klasy Vector 

                 return s; 

 

 

 

// Wynik

  

        } catch (CloneNotSupportedException e) { 

            // Nie powinno się zdarzyć , gdyŜ 

Stack

 jest „

Cloneable” 

            throw new InternalError(); 
        } 
    } 

Uwaga:  

metoda  clone()  nigdy  nie  powinna  wołać  operatora  new  ani  konstruktora  - 
zamiast  tego  wołać  powinno  się  super.clone()  i  utworzyć  obiekt  właściwego 
typu a następnie metody clone() dla składowych obiektu. 
 

2. Klasa, obiekt, interfejs, pakiet 

W. Kasprzak: Programowanie zdarzeniowe 

2 - 32 

 

Metody 

equals

 i 

hashCode

 - muszą być jednocześnie nadpisane. 

Metoda equals sprawdza, czy dwa obiekty są identyczne, tzn. czy przechowują 
tę samą wartość. Np. 

Integer one = new Integer(1), anotherOne = new Integer(1); 
if (one.equals(anotherOne))    System.out.println("Obiekty są równe"); 

Metoda  hashCode  zwraca  wartość  typu  int,  będącą  indeksem  dla  obiektu  w 
wykazie asocjacyjnym (hash table) - zwykle nie jest to odwzorowanie unikalne 
dla obiektów danej klasy. 
 


 

Metoda

 finalize

 - wywoływana jest automatycznie przed usunięciem obiektu. 

 


 

Metoda 

toString

  -  zamienia  obiekt  klasy  Object  w  obiekt  klasy  String 

umoŜliwiając "tekstowy wydruk" obiektu za pomocą System.out.println.  

Np. reprezentacja napisu dla liczby typu Integer to tekstowa postać liczby; napis 
dla obiektu klasy Thread podaje atrybuty obiektu takie, jak nazwa i priorytet.  
 

background image

2. Klasa, obiekt, interfejs, pakiet 

W. Kasprzak: Programowanie zdarzeniowe 

2 - 33 



 

Metoda 

getClass

  

Metoda zwraca reprezentację "run-time" klasy obiektu w postaci obiektu typu 
Class. MoŜna dowiedzieć się z niego o nazwie klasy, jej klasie bazowej i 
interfejsach, które implementuje klasa. Np. 

void PrintClassName(Object obj)  
{ System.out.println("Klasa obiektu to " + obj.getClass().getName()); } 

MoŜna utworzyć nowy obiekt tej samej klasy co pierwszy obiekt, np.: 

Object createNewInstanceOf(Object obj)  
{  return obj.getClass().newInstance(); } 

String.class

     lub 

Class.forName("String")

 - zwraca obiekt klasy 

Class

 opisujący typ "

String

". 

 


 

Metody

 notifynotifyAllwait

 - ich zadaniem jest synchronizacja wątków. 

2. Klasa, obiekt, interfejs, pakiet 

W. Kasprzak: Programowanie zdarzeniowe 

2 - 34 

2.5 Klasy zagnie

Ŝ

d

Ŝ

one i wewn

ę

trzne 

Definicja klasy jako składowej innej klasy. Np. 

class KlazaZewnetrzna{ // ... 
    class KlasaWewnetrzna {   /*... */ } 
    static class KlasaZagniezdzona { /* ... */} 

-

 

Klasa zagnieŜdŜona ma dostęp do składowych klasy obejmującej, równieŜ 
składowych prywatnych. 

-

 

Klasa  zagnieŜdŜona  moŜe  zostać  zadeklarowana  jako  statyczna  -  wtedy  jest 

związana z obejmującą ją klasą

.  

-

 

Klasa  niestatyczna  zagnieŜdŜona

  jest  klasą  wewnętrzną  w  obiekcie  klasy 

obejmującej.  Obiekt  klasy  wewnętrznej 

moŜe  wystąpić  jedynie  w  instancji

 

klasy obejmującej. 

-

 

Klasa zagnieŜdŜona moŜe być deklarowana jako abstract lub final

-

 

RównieŜ  specyfikatory  dostępu  jak  dla  składowych  klasy  mają  tu 
zastosowanie: private, public, protected, i package

 
Klasy mogą być teŜ definiowane w treści metod lub w dowolnym bloku kodu. 

background image

2. Klasa, obiekt, interfejs, pakiet 

W. Kasprzak: Programowanie zdarzeniowe 

2 - 35 

Wewn

ę

trzne klasy  

 

Przykład 2.13. 

Niech istnieje interfejs "Enumeration" o metodach: 

public boolean posiadaElementy(); 
public Object nastepnyElement(); 

 
Klasa implementująca interfejs moŜe stworzyć pętlę nad elementami obiektu  

while (posiadaElementy())      
    nastepnyElement();  

 
Gdyby  klasa  "Stack"  implementowała  "Enumeration"  powyŜsza  pętla  dla 
obiektu  mogłaby  wykonać  się  najwyŜej  raz  i  nie  byłoby  moŜliwe  jednoczesne 
wykonanie dwóch pętli.  
 
Stąd  pomysł  aby  klasa  wewnętrzna  "StackEnum"  -  wspomagająca  (tzw. 
"adapter")  - realizowała ten interfejs. 

2. Klasa, obiekt, interfejs, pakiet 

W. Kasprzak: Programowanie zdarzeniowe 

2 - 36 

public class Stack {      

    private Vector  elementy; 

    ...// kod metod i konstruktora pomijamy... 

    public Enumeration enumerator() {    
         return new StackEnum();  
    } 
    class StackEnum implements Enumeration { 
        int aktualnyElem = elementy.size() - 1; 
        public boolean posiadaElementy() {  
              return (aktualnyElem 

!=

 0);  

        } 
        public Object nastepnyElement() {   
            if (! posiadaElementy())  throw new NoElementException(); 
            else    return  elementy.elementAt (aktualnyElem --);  } 
    } 
}  

// Komentarz: klasa "StackEnum" odnosi się bezpośrednio do składowej 
// elementy w klasie Stack.  

background image

2. Klasa, obiekt, interfejs, pakiet 

W. Kasprzak: Programowanie zdarzeniowe 

2 - 37 

 

Klasa wewn

ę

trzna anonimowa 

Przykład 2.14.

 Teraz rolę klasy "adaptera", implementującej interfejs, przejmie 

klasa anonimowa w klasie Stack. 

public class Stack {     private Vector elementy; 

...// kod metod i konstruktora pomijamy... 

    public Enumeration enumerator() { 
        return new Enumeration() {

 

// Klasa anonimowa

 

            int currentItem = elementy.size() - 1; 
            public boolean  posiadaElementy() {   
                return (aktualnyElem != 0);  } 
            public Object nastepnyElement()  { 
                if (! posiadaElementy())  throw new NoElementException(); 
                else      return elementy.elementAt ( aktualnyElem --);  } 
       
    } 

2. Klasa, obiekt, interfejs, pakiet 

W. Kasprzak: Programowanie zdarzeniowe 

2 - 38 

 

Kwalifikatory dost

ę

pu dla klas zagnie

Ŝ

d

Ŝ

onych (wewn

ę

trznych): 

 

a. Jedynymi u

Ŝ

ytkownikami tej klasy wewm

ę

trznej s

ą

 

instancje klasy obejmuj

ą

cej lub jej klas pochodnych.  

protected 

b. Ka

Ŝ

dy mo

Ŝ

e u

Ŝ

ytkowa

ć

 tak

ą

 klas

ę

.  

public static 

c. Tylko instancje klasy deklaruj

ą

cej mog

ą

 u

Ŝ

ytkowa

ć

 

t

ę

 klas

ę

 zagnie

Ŝ

d

Ŝ

on

ą

 (wewn

ę

trzn

ą

) a ka

Ŝ

da 

instancja mo

Ŝ

e u

Ŝ

ytkowa

ć

 j

ą

 wiele razy. 

private 

d. Ta klasa zagnie

Ŝ

d

Ŝ

ona (wewn

ę

trzna) jest u

Ŝ

yta 

tylko raz dla utworzenia obiektu implementuj

ą

cego 

interfejs.  

anonimowa (brak 

kwalifikatora)  

e. Ta klasa zagnie

Ŝ

d

Ŝ

ona posiada informacje o klasie 

obejmuj

ą

cej (nie o instancjach) i u

Ŝ

ytkowana jest tylko 

przez klas

ę

 obejmuj

ą

c

ą

 i jej pochodne. 

protected static 

f. Podobnie jak przypadek e) ale bez klas 
pochodnych.  

private static 

 

background image

2. Klasa, obiekt, interfejs, pakiet 

W. Kasprzak: Programowanie zdarzeniowe 

2 - 39 

2.6 Interfejs 

-

 

Interfejs

 to zbiór deklaracji metod i ewentualnie pól stałych.  

-

 

Klasa abstrakcyjna

 moŜe implementować pewne metody, ale interfejs - nie. 

-

 

Klasa  konkretna

  posiada  co  najwyŜej  jedną  klasę  bazową  ale  moŜe 

implementować wiele interfejsów.  

Definicja interfejsu 

DeklaracjaInterfejsu { 
    TreśćInterfejsu 

Przykład 2.15 

public interface StockWatcher {  

// Definicja interfejsu

 

    final String sunTicker = "SUNW";   

// Deklaracja stałej symbolicznej

 

    final String oracleTicker = "ORCL"; 
    final String ciscoTicker = "CSCO"; 

// Deklaracja metody sygnalizującej zmianę wartości akcji 

    void valueChanged(String tickerSymbol, double newValue);   

2. Klasa, obiekt, interfejs, pakiet 

W. Kasprzak: Programowanie zdarzeniowe 

2 - 40 

Klasa  StockMonitor  ma  słuŜyć  do  monitorowania  cen  akcji.  Klasa  umozliwia 
rejestrowanie  się  innym  klasom,  które  chcą  być  powiadamiane  o  zmianach 
pewnych akcji. 

public class StockMonitor { 
    public void watchStockStockWatcher watcher, 
    String tickerSymbol, double delta) { 

// Monitorowana akcja i próg zmiany

 

     ... 
     } 

Uwagi: 

StockWatcher to nazwa interfejsu o jednej metodzie valueChanged.  
Obiekt  powiadamiany  o  zmianach  akcji  musi  implementowac  ten  interfejs  i 
posiadać metodę valueChanged.  
Gdy  StockMonitor  wykrywa  interesującą  obserwatora  zmianę  wywołuje  on 
metodę valueChanged obserwatora. 
Dzięki  zastosowaniu  interfejsu  nie  nakładamy  na  klasy  obserwatora  Ŝadnych 
związków  z  klasą  StockMonitor  -  moga  to  być  dowolne  klasy  nie  naleŜące  do 
hierarchii  dziedziczenia  klasy  StockMonitor  ani  między  sobą  -  muszą  jedynie 
implementować metodę wybranego interfejsu. 

background image

2. Klasa, obiekt, interfejs, pakiet 

W. Kasprzak: Programowanie zdarzeniowe 

2 - 41 

Elementy definicji interfejsu  



 

public - dostępny przez kaŜdą klasę w kaŜdym pakiecie (przy braku public - 
dostęp w trybie package); 



 

interface NazwaInterfejsu 



 

(opcjonalnie):  extends  listaNadinterfejsów  -  interfejs  moŜe  posiadac  więcej 
niŜ jeden nadinterfejs; 



 

treść interfejsu. 

 
Tre
ść interfejsu 


 

deklaracje  metod  -  wszystkie  posiadają  specyfikacje  (

niejawne

public

  i 

abstract



 

deklaracje stałych symbolicznych (niejawnie są one 

publicstatic

 i 

final

). 

 
W treści interfejsu 

nie mogą

 wystąpić specyfikatory składowych: 



 

transient, volatile, synchronized; 



 

private, protected

2. Klasa, obiekt, interfejs, pakiet 

W. Kasprzak: Programowanie zdarzeniowe 

2 - 42 

Implementacja interfejsu - jest to kontrakt zachowania się klasy. 

 

Przykład 2.16.

 Aplet implementujący interfejs StockWatcher

public class StockApplet extends Applet implements StockWatcher { 
    ... 
    public void valueChanged(String tickerSymbol, double newValue) { 
        if (tickerSymbol.equals(sunTicker)) {  ... 

// treść pomijamy

 

        } else if (tickerSymbol.equals(oracleTicker)) {  ... 

// treść pomijamy

 

           } else if (tickerSymbol.equals(ciscoTicker)) {  ... 

// treść pomijamy

 

              } 
    } 

Komentarz:  klasa  odwołuje  się  to  stałych  zdefiniowanych  w  interfejsie 
StockWatcher:    sunTicker,  oracleTicker,  ciscoTicker  -  poprzez  ich  proste 
nazwy. Nazwa kwalifikowana: StockWatcher.sunTicker 
 
Jeśli  klasa  implementująca  interfejs 

nie  posiada  definicji  wszystkich

  metod 

interfejsu i jego nadinterfejsów to musi być zadeklarowana jako 

abstrakcyjna

 

background image

2. Klasa, obiekt, interfejs, pakiet 

W. Kasprzak: Programowanie zdarzeniowe 

2 - 43 

Zastosowanie  interfejsu  jako  typu

  -  definicja  nowego  interfejsu  oznacza 

utworzenie 

nowego referencyjnego typu 

danych.  

Przykład 2.17 

public class StockMonitor { 
    public void watchStock(StockWatcher watcher, 
                           String tickerSymbol, double delta) {   ... 

// treśc pomijamy 

    } 

Do  zmiennej  referncyjnej  typu  interfejsu 

moŜna

 

przypisać

  tylko 

obiekt  klasy 

implementującej dany interfejs.

 

 
Raz ustalone interfejsy nie powinny juŜ ulegać zmianie 
Nie  powinniśmy  uzupełniać  definicji  interfejsu  w  późniejszym  czasie. 
Wymagałoby to zmian w programach implementujących ten interfejs. 
Wtedy naleŜy zdefiniować specializowany interfejs, np.: 

public interface StockTracker extends StockWatcher { 
    void currentValue(String tickerSymbol, double newValue); 

2. Klasa, obiekt, interfejs, pakiet 

W. Kasprzak: Programowanie zdarzeniowe 

2 - 44 

2.7 Pakiet 

Pakiety  stosowane  są  w  celu  uniknięcia  konfliktu  nazw  klas  i  interfejsów, 
zapewnienia ochrony dostępu i nadania struktury - pogrupowania powiązanych 
ze sobą klas i interfejsów.  Np.  

java.lang - 

zawiera podstawowe klasy języka;

 

java.io - 

wejście - wyjście; 

 

Utworzenie własnego pakietu 

NaleŜy podac instrukcję ze słowem kluczowym package na początku pliku. Np. 

package graphics; 
public class Circle extends Graphic implements Draggable { 
    . . . 

---------------------------- 

package graphics; 
public class Rectangle extends Graphic implements Draggable { 
    . . . 

background image

2. Klasa, obiekt, interfejs, pakiet 

W. Kasprzak: Programowanie zdarzeniowe 

2 - 45 

 

W  jednym  pliku

  moŜna  zdefiniować  wiele  klas,  ale 

tylko  jedna

  z  nich  moŜe 

być publiczna

 i 

jej nazwa

 musi odpowiadać 

nazwie pliku

 
Plik 

pozbawiony

  instrukcji  package    -  klasy  w  nim  definiowane  wchodzą  do 

domyślnego nienazwanego pakietu

 

Kwalifikowana  nazwa

  naszej  klasy  "Rectangle"  to  graphics.Rectangle  -  a 

systemowej klasy "Rectangle" - java.awt.Rectangle.  
 
Konwencja  dla  uniknięcia  dublowania  się  nazw  pakietów:  producenci 
poprzedzają nazwy pakietów internetową nazwą swojej firmy -  

nazwaFirmy.nazwapakietu 

 

Z zewnątrz pakietu

 istnieje 

dostęp

 do 

publicznych elementów pakietu

. NaleŜy: 

-

 

(1) podać nazwę kwalifikowaną, lub 

-

 

(2) zaimportować pojedynczy element pakietu, lub 

-

 

(3) zaimportować cały pakiet. 

 

2. Klasa, obiekt, interfejs, pakiet 

W. Kasprzak: Programowanie zdarzeniowe 

2 - 46 

Np. (1)  

graphics.Rectangle 
graphics.Rectangle myRect = new graphics.Rectangle(); 

 
(2) 

import graphics.Circle; 
Circle myCircle = new Circle(); 

 
(3) 

import graphics.*; 
Circle myCircle = new Circle(); 
Rectangle myRectangle = new Rectangle(); 

 

Środowisko wykonania Javy

 domyślnie importuje 

dwa pakiety

-

 

java.lang 

-

 

domyślny 

pakiet. 

background image

2. Klasa, obiekt, interfejs, pakiet 

W. Kasprzak: Programowanie zdarzeniowe 

2 - 47 

Konwencja rozmieszczania plików programu 

Plik źródłowy umieszczany jest w katalogu o nazwie pakietu do którego klasy 
pliku naleŜą. 
Np. 

 

 

nazwa klasy 

graphics.Rectangle 

katalog pliku 

graphics/Rectangle.java 

Np. 

 

2. Klasa, obiekt, interfejs, pakiet 

W. Kasprzak: Programowanie zdarzeniowe 

2 - 48 

Plik 

*.class

 moŜe znaleźć się w innym katalogu niŜ plik źródłowy: 

 

Np.       

 

Kompilator i interpreter przeszukują katalogi lub pliki ZIP podane jako ścieŜka 
klas.  
Np.  powyŜej  byłyby  to  "

classes

"  dla  interpretera  i  "

sources

"  dla 

kompilatora. 
Domyślnie  przeszukiwany  jest 

bieŜący  katalog

  i 

plik  ZIP

  zawierający 

klasy 

platformy Java danej instalacji

.