I termin zwykły: grupa A
(Punktacja: 10+12+10+8+10)
1. Podaj i krótko omów dwa sposoby przekazywania wartości parametrów podczas wywołania metody. Wyjaśnij jaki jest sposób przekazywania wartości parametrów w Javie.
Mamy przekazywanie przez wartosc (call by value) i przez referencje (call by reference). W Javie wystepuje przekazywanie przez wartosc, czyli operujemy na kopiach parametrow. Napisalem jeszcze co jest wiazane statycznie, a co dynamicznie. Wszystko bylo w wykladach. Jak sie rozkmini te przyklady, to powinno byc dobrze. Napisalem jeszcze, ze w Javie referencje jawnie nie wystepuja (Chmielewski cos o tym wspominal).
[wykład1] W Jawie wartości parametrów przekazywane są zgodnie z zasadą wywołania przez wartość (ang. call by value). Znaczy to tyle, ze podczas wykonania metody aktualne wartości jej parametrów są kopiowane do nowych zmiennych, a po jej
wykonaniu przywracane parametrom. W konsekwencji, metoda nie zmienia wartości swoich parametrów.
Istnieją zasadniczo dwa mechanizmy wiązania: statyczne (w czasie kompilacji) i dynamiczne (w czasie wykonania). W Javie atrybuty są wiązane statycznie, a metody dynamicznie zależnie od typu aktualnego parametru.
2. Zaimplementuj stos z metodami:
• push (Object o), która kładzie element na górę stosu;
• pop(), która zwraca element znajdujący się na górze stosu jednocześnie usuwając go.
///////////wersja 1
import java.util.Vector
public class Stack {
private Vector<Object> stack;
Stack();
public void push(Object A) {
this.stack.add(A);
};
public void pop() {
this.stack.remove(this.stack.length());
};
};
/* imho ta wersja jest niepoprawna, bo pop powinien zwracac zerowy element, a nie ten z konca vectora */
//////////////wersja 2
import java.util.LinkedList;
public class Stos {
private LinkedList<Object> st;
public Stos(){
st = new LinkedList<Object>();
}
public void push(Object a){
this.st.add(0, a);
}
public void pop(){
this.st.removeFirst();
}
}
///////////ulepszone rozw wersji 2
import java.util.LinkedList;
public class Stos {
private LinkedList<Object> st;
public Stos(){
st = new LinkedList<Object>();
}
public void push(Object a){
this.st.add(0, a);
}
public Object Pop{
Object a;
a=this.st.get(0);
this.st.removeFirst();
return a;
}
}
///////////wersja 3
class Stos extends Stack
{
}
///////////wersja 4
class Stos extends LinkedList
{
public void push(Object o)
{
super.addFirst(o);
}
public Object pop()
{
return super.removeFirst();
}
3. Omów krótko zasadę podstawiania sformułowaną przez Barbarę Liskov.
Obiekt podklasy musi dac sie wykorzystac wszedzie tam, gdzie obiekt nadklasy. Wedlug mnie z tego wynika, ze podklasa musi implementowac wszystkie metody interfejsow, z ktorych dziedziczy i nie moze rzucac innych wyjatkow niz deklarowane w nadklasie. Zasada Liskov wyklucza tez po mojemu dziedziczenie wielobazowe.
[wykład1] Idea dziedziczenia jest oparta na zasadzie podstawiania sformułowanej przez Barbarę Liskov: obiekt podklasy ma dawać się użyć wszędzie tam, gdzie może być użyty obiekt nadklasy.
4. Wyjaśnij, jak będzie działała metoda zawierająca następujący fragment jeśli wykonanie try spowoduje rzucenie wyjątku:
try {
. . . //execute code;
} catch (ExceptionX e) {
. . . //do something about it
} catch (ExceptionY e) {
. . . //do something about it
} catch (Exception e) {
. . . //do something about it
} finally {
. . .
}
[wykład2-15]Wykona sie pierwsza klauzula catch, ktora zlapie wyjatek. Finally wykona sie zawsze, bez wzgledu na to, czy wyjatek zostal zlapany, czy nie.
jest to odpowiednik switch w C. w C default nie zawsze sie wykona
5. Omów krótko sytuację, w której klasa Thread nie wystarcza i musi być zastąpiona interfejsem Runnable. Przedstaw sposób używania tego interfejsu i obiektów klas ten interfejs implementujących.
Thread nie wystarcza, jak mamy juz jakas klase, ktora dziedziczy z jakiejs innej, a chcemy ja wykorzystywac wielowatkowo. Poniewaz w Javie klasa moze dziedziczyc tylko z jednej klasy (abstrakcyjnej albo konkretnej), ale moze implementowac dowolnie wiele interfejsow, trzeba zaimplementowac metode run(), ktora bedzie uruchamiana jako osobny watek.