LULEÅ TEKNISKA UNIVERSITET
Tentamen i
Objektorienterad programmering och design
Totala antalet uppgifter: 5
Lärare: Håkan Jonsson, Andrey Kruglyak, 491000
Resultatet offentliggörs senast: 2010-04-09.
Kurskod
D0010E
Datum
2010-03-19
Skrivtid
5 tim
Tillåtna hjälpmedel: Inga.
OBS! Lösningar får inte baseras på fördefinierade klasser ur t ex Javas standardbibliotek
annat än där detta uttryckligen tillåts.
1. Teori
a) Vad innebär det att något är deklarerat protected?
(1p)
b) Låt A, B och C vara tre klasser av vilka B och C ligger i paketet p1 medan A
ligger i p2. B ärver A och C ”har en” A.
Rita UML-diagrammet som beskriver klasserna och deras relationer till varandra.
(1p)
c) Denna klass innehåller ett programmeringsfel. Vilket då?
(1p)
public class Main {
public int i = 10;
public static int increaseByTen(int i) {
return i + this.i;
}
}
d) Denna metod innehåller en annan slags fel. Vilket?
(1p)
public int factorial(int n) {
return n * factorial (n-1);
}
e) Vad är huvudpoängen med exceptions (”undantag”)?
(1p)
f) Varför finns det två sorters undantag, checked (Exception) och unchecked
(RuntimeException)? Förklara gärna med exempel om du vill.
(1p)
2. Observer-Observable mönstret
Designmönstret Observer (Observer design pattern på engelska) implementeras i
Java med klassen java.util.Observable och gränssnittet java.util.Observer.
Implementera två (eller flera) javaklasser där en väsentlig del av funktionen uppnås
med hjälp av detta mönster. Du får själv hitta på vad klasserna ska göra. Förklara
hur klasserna är tänkta att fungera och hur designmönstret därmed används. (6p)
Klassen java.util.Observable innehåller metoderna
• public void addObserver(Observer o),
• protected void setChanged(),
• public void notifyObservers(Object arg) och
• public void notifyObservers()
medan gränssnittet java.util.Observer endast deklarerar metoden
• public void update(Observable o, Object arg).
Anna
John
Stina
Adam
Bill
Maria
Emma
Carl
Pia
Thomas
Figur 1: Ett släktträd.
3. Släktträd
Figur 1 visar ett släktträd där pilarna går från barn till förälder. Man ser t ex att
Marias föräldrar är Anna och John, och att Anna är en av Emmas förfäder (hennes
mormor). Genom att följa pilarna i ett släktträd kan man hitta en persons alla
förfäder.
Du får i denna uppgift utgå från att släktträd är naturliga i den meningen att ingen
är sin egen förfader/förmoder (alltså inga cykler) och att alla namn är unika1 .
a) Deklarera en class Person för en person i ett släktträd. Man ska kunna
skapa personobjekt på två sätt; med namn (en sträng) och personens två
föräldrar (som är av typen Person) eller med enbart namn, vilket man gör
om föräldrarna är okända.
(3p)
Exempel: Följande kod skapar släktträdet i Figur 1:
Person
Person
Person
Person
Person
Person
Person
Person
Person
Person
anna
john
maria
carl
adam
emma
stina
pia
bill
thomas
=
=
=
=
=
=
=
=
=
=
new
new
new
new
new
new
new
new
new
new
Person("Anna");
Person("John");
Person("Maria", anna, john);
Person("Carl", anna, john);
Person("Adam");
Person("Emma", maria, adam);
Person("Stina");
Person("Pia", john, stina);
Person("Bill");
Person("Thomas", pia, bill);
b) Lägg till en dynamisk metod public boolean isAncestor(Person p) som
avgör om personen är en förfader/förmoder till p.
(3p)
En person A är en förfader/förmoder till en person B om, och endast om, A
antingen är förälder till B eller en förfader/förmoder till en av B:s föräldrar.
Exempel: Stina är förmoder till Thomas (hans mormor) eftersom hon är
förälder till Pia som i sin tur är förälder till Thomas.
1
Strängar kan jämföras med equals och, från Java 5.0, även med ==.
4. Dynamic dispatch
simulator
<<abstract>>
Event
# time : double
#duration : double
- id ; int
+ Event(double time, double duration, int id)
+ <<abstract>> execute(State s) : void
+ toString() : String
State
running : boolean
+ setActive(boolean b) : void
StartEvent
+ execute(State s) : void
StopEvent
+ execute(State s) : void
Figur 2: UML-diagram.
a) UML-diagrammet i figur 2 beskriver en del av en generell händelsestyrd simulator2 . Skriv klasserna.
(4p)
• Event har, förutom två metoder för att utföra en händelse och få en
strängrepresentation av den, variabler för en händelses tid, varaktighet
och identitetsnummer. Identitetsnumret ska vara unikt och tilldelas automatiskt utan inblandning från eventuella underklasser. Du avgör själv
hur toString bör implementeras för att du ska kunna lösa uppgiften.
• Metoden setActive i State sätter klassens boolska flagga, som indikerar
för simulatorns övriga delar om en simulering ska fortgå eller avbrytas.
• Metoden execute ska i underklasserna StartEvent och StopEvent implementeras så att simuleringen markeras för att fortgå respektive avbrytas
genom anrop till metoden setActive i State-objektet när de exekveras.
Du avgör själv om, och i så fall hur, klasserna ska skugga toString.
b) Skapa ytterligare en klass Main i ett annat paket än de i UML-diagrammet
med en statisk metod printEvent(Event e) som skriver ut händelsen e:s
typ, tid, varaktighet och identitetsnummer med System.out.println. (2p)
Begränsning: Du får inte använda instanceof för att t ex ta reda på vilken
typ en viss händelse har.
5. SimpleVector
Implementera klassen SimpleVector som den beskrivs i bilagan. Om du vill får du
göra den generisk men detta krävs inte. Metoden toString() ska rada upp vectorns
innehåll i ordning. Du behöver inte skriva någon javadoc.
(6p)
Observera förbudet mot användning av fördefinierade klasser som t ex java.util.Vector(!)
Ett exempel på lämplig intern representation i SimpleVector är arrayer.
2
Inte nödvändigtvis den i laboration 5.
SimpleVector
2010-03-13 18.05
2010-03-13 18.05
equals, getClass, hashCode, notify, notifyAll, wait, wait, wait
Package Class Use Tree Deprecated Index Help
PREV CLASS NEXT CLASS
SUMMARY: NESTED | FIELD | CONSTR | METHOD
SimpleVector
FRAMES NO FRAMES
DETAIL: FIELD | CONSTR | METHOD
Constructor Detail
d0010e100319
SimpleVector
Class SimpleVector
public SimpleVector()
java.lang.Object
d0010e100319.SimpleVector
Creates an empty vector with length zero.
public class SimpleVector
extends java.lang.Object
Method Detail
This class provides vectors that are similar to those provided by the class Vector in the Java standard
library but simpler to use. A SimpleVector acts as an array that automatically grows and shrinks in
length as needed.
size
public int size()
Elements are indexed 0 to size()-1, i.e. the current size of the vector minus one. By the first element is
meant the element at index 0. The element at index size()-1 lies at the end of the vector.
Returns the current length of the vector. This is the number of successful add and insert operations
performed minus the number of (successful and performed) remove operations.
Returns:
the current length.
Constructor Summary
SimpleVector()
Creates an empty vector with length zero.
elementAt
public java.lang.Object elementAt(int i)
Method Summary
Returns an element currently stored in the vector.
void add(java.lang.Object item)
Adds an element to the vector at its end.
Parameters:
i - the index of the element.
Returns:
the element at index i.
Throws:
java.lang.Object elementAt(int i)
Returns an element currently stored in the vector.
void insert(java.lang.Object item, int index)
Inserts an element into the vector, which length increases by one.
java.lang.ArrayIndexOutOfBoundsException
- if i is not a valid index.
void remove(int index)
Removes an element from the vector and decreases the length of the vector
by one.
void set(java.lang.Object item, int index)
add
public void add(java.lang.Object item)
Substitutes an element for another.
int size()
Adds an element to the vector at its end. The length of the vector increases by one and the added
element ends up at index size()-1 in this enlarged vector.
Returns the current length of the vector.
java.lang.String toString()
Parameters:
item - the item that should be added to the vector.
Returns a string representation of the object.
Methods inherited from class java.lang.Object
file:///Users/hj/Documents/src/d0000test2/doc/index.html
Sida 1 av 4
file:///Users/hj/Documents/src/d0000test2/doc/index.html
Sida 2 av 4
SimpleVector
2010-03-13 18.05
remove
SimpleVector
2010-03-13 18.05
toString
in class java.lang.Object
See Also:
public void remove(int index)
Object.toString()
Removes an element from the vector and decreases the length of the vector by one. The vector is
contracted by shifting all elements at indices higher than that of the removed element one step
towards the first element of the vector.
Parameters:
index - the index of the element that should be removed.
Throws:
java.lang.ArrayIndexOutOfBoundsException - if i is not a valid index.
Package Class Use Tree Deprecated Index Help
PREV CLASS NEXT CLASS
SUMMARY: NESTED | FIELD | CONSTR | METHOD
FRAMES NO FRAMES
DETAIL: FIELD | CONSTR | METHOD
insert
public void insert(java.lang.Object item,
int index)
Inserts an element into the vector, which length increases by one. The element ends up at index
index shifting all other elements that were placed at indices index or higher one step towards the
end of the vector. The inserted element ends up before all these. It is valid to insert an element into
an empty vector but only at index 0.
Parameters:
item - the inserted element.
index - the index at which the element should be placed.
Throws:
java.lang.ArrayIndexOutOfBoundsException - if index is not a valid index.
set
public void set(java.lang.Object item,
int index)
Substitutes an element for another.
Parameters:
item - the item that should replace the element currently in the vector.
index - the index at which the substitution should be made.
Throws:
java.lang.ArrayIndexOutOfBoundsException - if index is not a valid index.
toString
public java.lang.String toString()
Returns a string representation of the object.
Overrides:
file:///Users/hj/Documents/src/d0000test2/doc/index.html
Sida 3 av 4
file:///Users/hj/Documents/src/d0000test2/doc/index.html
Sida 4 av 4