1 (9) TENTAMEN: Objektorienterad programmering Läs detta! Uppgifterna är inte ordnade efter svårighetsgrad. Börja varje uppgift på ett nytt blad. Skriv din tentamenskod på varje blad (så att vi inte slarvar bort dem). Skriv rent dina svar. Oläsliga svar r ä t t a s e j! Skriv inte med rödpenna! Programkod som finns i tentamenstesen behöver ej upprepas. Programkod skall skrivas i Java 5 eller senare version, samt vara indenterad och renskriven. Onödigt komplicerade lösningar ger poängavdrag. Givna deklarationer, parameterlistor etc. får ej ändras. Läs igenom tentamenstesen och förbered ev. frågor. I en uppgift som består av flera delar får du använda dig av funktioner klasser etc. från tidigare deluppgifter, även om du inte löst dessa. Lycka till!
2 (9) Uppgift 1 Välj ett alternativ för varje fråga! Garderingar ger noll poäng. Inga motiveringar krävs. Varje korrekt svar ger två poäng. 1. Antag att vi har definierat en egen klass (detaljer utelämnade): public class MyClass {... Vad skrivs ut av följande kodavsnitt? ArrayList<MyClass> l = new ArrayList<MyClass>(); l.add(new MyClass()); System.out.println(l.contains(new MyClass())); a. false b. true c. Null pointer exception 2. Vilket påstående är korrekt om följande metoderna i klassen C? public class C { private int x = 123; private static int y = 456; public void f() {... x = 27;... public void g() {... y = 96;... public void h() {... j();... public static void i() {... x = 48;... public static void j() {... y = 164;... public static void k() {... g();... ; a. f,g,h ger kompileringsfel men i,j,k är korrekta. b. f,g,i är korrekta men h,j,k ger kompileringsfel. c. f,g,h,j är korrekta men i,k ger kompileringsfel. d. i,j,k ger kompileringsfel men f,g,h är korrekta. 3. Om Base är en basklass till Sub och variablerna b och s har typen Base resp. Sub, vilken tilldelning är då otillåten i Java? a. b = s; b. s = (Sub)b; c. s = b; forts.
3 (9) 4. Vilket påstående stämmer bäst? public class Person { private String name; private String address; private String phone; private String email; // date of last visit private int year; private String month; private int day;... a. Person har låg kohesion b. Person har hög kohesion c. begreppet kohesion är enbart tillämpbart på metoder, inte på klasser 5. Vad kan man säga om graden av koppling mellan klasserna AlarmMonitor, FireAlarm TemperatureAlarm och PressureAlarm? public class AlarmMonitor { private AlarmQueue queue;... public void monitoralarms() { Object alarm = queue.getnextalarm(); while ( true ) { if (alarm instanceof TemperatureAlarm ) ((TemperatureAlarm)alarm).handleTemp(); else if (alarm instanceof PressureAlarm ) ((PressureAlarm)alarm).handlePress(); else if (alarm instanceof FireAlarm ) ((FireAlarm)alarm).handleFire(); a. kopplingen är hög b. kopplingen är låg c. graden av koppling är omöjlig att bedöma (10 p)
4 (9) Uppgift 2 En vårdcentral behöver hjälp med att hålla reda på sina patientbesök. Varje läkare har en egen kö. En schemaläggning (eng. schedule) av ett besök innehåller patientens id, en orsak till besöket, samt tidpunkt för besöket. Elementen i kön ordnas i tidsordning. Klassen Date används för att lagra tidpunkter. Klassen är färdig och dess enda egenskap som är relevant för uppgiften är att två datumobjekt kan jämföras: Man kan alltså skriva d1.compareto(d2) för att få reda på om tidpunkten d1 kommer före d2. Ett objekt av klassen Schedule motsvarar schemaläggningsinformation om ett patientbesök. public class Schedule { private String patientid; private String cause; private Date date; public Schedule(String patientid,string cause,date date) { this.patientid = patientid; this.cause= cause; this.date = date; public String getpatientid() { return patientid; public String getcause() { return cause; public Date getdate() { return date; a) Lägg till nödvändiga delar till klassen så att schemaläggningsobjekt kan jämföras med avseende på tidpunkt. Om s1 och s2 har typen Schedule, så skall man kunna skriva s1.compareto(s2) för att avgöra om besöket s1 skall ske före s2. (2 p)
5 (9) b) Eftersom schemaläggningsobjekt nu lätt kan jämföras i tidsordning kan vi använda klassen TreeSet<Schedule> för att lagra en patientköer. Elementen lagras automatiskt i växande tidsordning eftersom de är jämförbara enligt uppgift a. Ev. återbesökstider av mer akut karaktär passerar t.ex. då andra tider för lägre prioriterade besök i kön. Klassen Hospital skall hålla reda på ett antal läkare och deras respektive patientköer. Klassen skall ha följande metoder: public boolean newdoctor(string name) Lägger in en ny läkare med angivet namn i systemet. Returnerar true om läkaren ej var registrerad tidigare och registreringen gick bra, false annars. public Schedule getnextpatient(string doctor) Returnerar ett schemaläggningsobjekt med information om nästa patientbesök till doctor. Objektet tas bort från kön. Om kön var tom returneras null. public boolean schedule(string doctor, String patientid, String cause, Date date) Placerar ett schemaläggningsobjekt med angiven information i kön för doctor. Returnerar true vid lyckad operation (på kön) och false om läkaren är okänd. Använd en HashMap för att lagra tabellen med läkarna och deras köer. (8 p)
6 (9) Uppgift 3 Klassen Clock kan användas för att representera klockslag. Den har följande konstruktorer och metoder: public Clock(int hour,int minute,int second) throws IllegalStateException sätter tiden till angivet klockslag. Kastar angivet undantag om argumenten ej anger ett korrekt klockslag mellan 00:00:00 och 23:59:59. protected Clock(int seconds) throws IllegalStateException sätter tiden till angivet klockslag mätt i sekunder från midnatt. Kastar angivet undantag om argumentet ej anger ett korrekt klockslag mellan 00:00:00 och 23:59:59. protected int getseconds() returnerar tiden mätt i sekunder från midnatt. public int gethour() returnerar timmarna i klockslaget som representeras av detta objekt. public int getminute() returnerar minuterna i klockslaget som representeras av detta objekt. public int getsecond() returnerar sekunderna i klockslaget som representeras av detta objekt. public void tick() stegar fram tiden i klockslaget som representeras av detta objekt en sekund. Definiera en subklass SubClock till Clock och inför följande metod i subklassen: public SubClock diff(clock other) Metoden diff skall returnera ett klockobjekt som innehåller tidskillnaden mellan det anropande objektet och det andra objektet. Om det andra objektet representerar ett klockslag som ligger före det första så skall det andra klockslaget avse nästkommande dygn, vilket framgår av exemplet nedan. SubClock c1 = new SubClock(12,34,56); SubClock c2 = new SubClock(17,21,48); Clock d = c1.diff(c2); d.gethour(); 4 d.getminute(); 46 d.getsecond(); 52 d = c2.diff(c1); d.gethour(); 19 d.getminute(); 13 d.getsecond(); 8 I SubClock får inga nya instansvariabler definieras. (10 p)
7 (9) Uppgift 4 a) Vilka av överskuggningarna av metoderna f och g i Sub är tillåtna i Java, vilka ger kompileringsfel? Motivera svaret! public class A { public class B extends A { public class Super { public A f() {... public Super g(a x) {... public class Sub extends Super { 1. public A f() { return new A(); 2. public A f() { return new B(); 3. public B f() { return new A(); 4. public B f() { return new B(); 5. public Sub g(a x) { return new Sub(); 6. public Super g(b x) { return new Sub(); 7. public Sub g(b x) { return new Super(); b) Vad skrivs ut av anropet obj.h() nedan? Motivera svaret! (7 p) public abstract class Super { public void f() { g(); protected void g() { System.out.println("Super.g"); public abstract void h(); public class Sub extends Super { protected void g() { System.out.println("Sub.g"); public void h() { f();... Super obj = new Sub(); obj.h(); (3p)
8 (9) Uppgift 5 a) Skapa en klass Point för punkter i planet. Klassen skall ha två konstruktorer. Med den ena skall man kunna skapa standardpunkten (0,0) och med den andra en punkt i valfri position som anges via två parametrar. Alla koordinater skall representeras med typen int. Inför lämpliga instansvariabler. public Point() initierar detta objekt till positionen (0,0). public Point(int x,int y) initierar detta objekt till positionen (x,y). public String tostring() Den returnerade strängen skall ha formen (x-koordinat,y-koordinat). public int getx() returnerar punktens x-koordinat. public int gety() returnerar punktens y-koordinat. public double distance(point p) returnerar avståndet från denna punkt till p. Avståndet mellan (a,b) och (c,d) är 2 2 ( a c) ( b d) (Math.sqrt()). public Point clone() returnerar en djup kopia av detta objekt. public boolean equals(object other) returnerar true om other refererar till samma punkt i planet som detta objekt, och false annars. Metoden skall ej vara överskuggningsbar vid arv. public int hashcode() returnerar en hash-kod för detta objekt. (10 p)
9 (9) b) En polygon är en mängd punkter i planet som sammanbinds av raka sträckor, t.ex. (x 0,y 0 ) (x 2,y 2 ) (x 1,y 1 ) (x 3,y 3 ) (x 4,y 4 ) Polygonens längd är den sammanlagda längden av sträckorna som förbinder punkterna. Implementera klassen Polygon för att lagra polygoner. Använd en lista för att lagra punkterna. Punkternas index i listan skall avspegla insättningsordningen. Den först insatta punkten skall alltså ha index 0. Klassen skall ha följande konstruktor och metoder: public Polygon() en konstruktor som skapar en tom polygon. public void add(point p) adderar p till polygonen. public Point get(int i) returnerar polygonens i:e punkt. Punkterna numreras från 0 och uppåt. Metoden skall kasta undantaget IndexOutOfBoundsException om i anger ett index utanför indexområdet. public double getlength() returnerar polygonens längd. public Polygon xmirror() returnerar en ny polygon som är en spegling av polygonen i x-axeln. public Polygon scale(double scalefactor) returnerar en kopia av polygonen, skalad enligt scalefactor. public Polygon clone() returnerar en djup kopia av polygonen. (10 p)