[ Pobierz całość w formacie PDF ]
d owym IntStack.java. Interfejs zostanie wykorzystany przez dwie ró ne implementacje stosu.
// Definicja interfejsu dla stosu liczb ca kowitych.
interface IntStack {
void push(int item); // zapami tanie elementu
int pop(); // pobranie elementu
}
Nast puj cy program tworzy klas o nazwie FixedStack, która implementuje stos o sta ym
rozmiarze.
// Implementacja IntStack u ywaj ca tablicy o sta ym rozmiarze.
class FixedStack implements IntStack {
private int stck[];
private int tos;
// alokacja i inicjalizacja stosu
FixedStack(int size) {
stck = new int[size];
tos = -1;
}
// umieszczenie elementu na szczycie stosu
public void push(int item) {
if(tos==stck.length-1) // u ycie zmiennej sk adowej length
Poleć książkę
Kup książkę
234 Cz I J zyk Java
System.out.println("Stos jest pe ny.");
else
stck[++tos] = item;
}
// zdj cie elementu ze szczytu stosu
public int pop() {
if(tos
System.out.println("Stos nie zawiera adnych elementów.");
return 0;
}
else
return stck[tos--];
}
}
class IFTest {
public static void main(String args[]) {
FixedStack mystack1 = new FixedStack(5);
FixedStack mystack2 = new FixedStack(8);
// umieszczenie pewnych liczb na stosach
for(int i=0; i
for(int i=0; i
// zdj cie liczb ze stosów
System.out.println("Stos w mystack1:");
for(int i=0; i
System.out.println(mystack1.pop());
System.out.println("Stos w mystack2:");
for(int i=0; i
System.out.println(mystack2.pop());
}
}
Poni ej znajduje si druga implementacja interfejsu IntStack, która tworzy stos o dynamicznie
zmieniaj cym si rozmiarze. W tej implementacji tworzony jest stos z pewnym rozmiarem
pocz tkowym. Je li zostanie on przekroczony, stos jest rozszerzany jego rozmiar wzrasta
dwukrotnie.
// Implementacja rozszerzaj cego si stosu.
class DynStack implements IntStack {
private int stck[];
private int tos;
// alokacja i inicjalizacja stosu
DynStack(int size) {
stck = new int[size];
tos = -1;
}
// umieszczenie elementu na szczycie stosu
public void push(int item) {
// je li stos jest pe ny, alokacja nowej tablicy o wi kszym rozmiarze
if(tos==stck.length-1) {
Poleć książkę
Kup książkę
Rozdzia 9. Pakiety i interfejsy 235
int temp[] = new int[stck.length * 2]; // podwojenie rozmiaru
for(int i=0; i
stck = temp;
stck[++tos] = item;
}
else
stck[++tos] = item;
}
// zdj cie elementu ze szczytu stosu
public int pop() {
if(tos
System.out.println("Stos nie zawiera adnych elementów.");
return 0;
}
else
return stck[tos--];
}
}
class IFTest2 {
public static void main(String args[]) {
DynStack mystack1 = new DynStack(5);
DynStack mystack2 = new DynStack(8);
// p tle powoduj zwi kszenie rozmiaru stosu
for(int i=0; i
for(int i=0; i
System.out.println("Stos w mystack1:");
for(int i=0; i
System.out.println(mystack1.pop());
System.out.println("Stos w mystack2:");
for(int i=0; i
System.out.println(mystack2.pop());
}
}
Poni szy kod programu korzysta z obu implementacji: FixedStack i DynStack. Korzysta przy
tym ze zmiennej referencyjnej interfejsu. Oznacza to, e wywo ywane metody pop() i push()
s identyfikowane dynamicznie (w czasie wykonywania programu) zamiast w trakcie kom-
pilacji.
/* Utworzenie zmiennej referencyjnej interfejsu i
u ycie jej do dost pu do stosu.
*/
class IFTest3 {
public static void main(String args[]) {
IntStack mystack; // utworzenie zmiennej referencyjnej interfejsu
DynStack ds = new DynStack(5);
FixedStack fs = new FixedStack(8);
mystack = ds; // za adowanie stosu dynamicznego
// umieszczenie warto ci na stosie
for(int i=0; i
Poleć książkę
Kup książkę
236 Cz I J zyk Java
mystack = fs; // za adowanie stosu o sta ym rozmiarze
for(int i=0; i
mystack = ds;
System.out.println("Warto ci na stosie dynamicznym:");
for(int i=0; i
System.out.println(mystack.pop());
mystack = fs;
System.out.println("Warto ci na stosie o sta ym rozmiarze:");
for(int i=0; i
System.out.println(mystack.pop());
}
}
W tym programie zmienna mystack jest typu IntStack. Je li wi c zawiera tak sam warto
jak ds, korzysta z metod push() i pop() zdefiniowanych dla klasy DynStack. Je li zawiera tak
sam warto jak fs, korzysta z metod push() i pop() zdefiniowanych dla klasy FixedStack.
Jak ju wspomnia em, wybór wersji metody dokonywany jest w sposób dynamiczny w trakcie
wykonywania programu. Dost p do wielu implementacji interfejsu przez zmienne referencyjne
to najbardziej u yteczny sposób wykorzystania polimorfizmu w j zyku Java.
Zmienne w interfejsach
Mo na u y interfejsów do wprowadzenia w wielu klasach tych samych sta ych. Wystarczy
w interfejsie zadeklarowa i zainicjalizowa zmienne. Klasa implementuj ca taki interfejs
[ Pobierz całość w formacie PDF ]