Fiktiv Tentamen 2D4135 vt 2004 Objektorienterad programmering, design och analys med Java Tentan har en teoridel och en problemdel. På teoridelen är inga hjälpmedel tillåtna och på problemdelen är alla skriftliga hjälpmedel tillåtna. Man löser teoridelen först, lämnar in den och tar sen fram sina böcker m.m. Använd absolut inte mer än 2 timmar till teoridelen! Teoridelen har 20 poäng och problemdelen har 32 poäng. Dessutom kan man få tentapoäng för avklarade laborationer. 1-2 labmoment klara ger 1 bonuspoäng, 3-4 labmoment klara ger 2 bonuspoäng och om man gjort samtliga labmoment så får man 4 bonuspoäng på tentan. Preliminära betygsgränser: För godkänt krävs 25 poäng varav minst 10 poäng från problemdelen, för betyg 4 krävs 34 poäng och för betyg 5 krävs 43 poäng. Teoridel T1) (4p) Förklara kort följande grundläggande begrepp inom objektorienterad programmering: a) Klass b) Instans c) Arv d) Inkapsling T2 (2p) a)vad menas med att en klass är abstrakt (abstract i Java) respektive att en metod är abstrakt? b) Vad använder man abstrakta klasser till inom objektorienterad programmering? Ge gärna ett exempel (helst utan programkod), det krävs dock inte. T3 (2p) a) Vad menas med multipelt arv? Beskiv i ord i en mening och rita ett UMLdiagram. b) Vissa OO-språk, t.ex. Java har inte multipelt arv. Då kan man använda s.k. komposition i stället. Beskriv denna teknik. T4 (2p) a) Förklara kort vad designmönster är. b) Nämn minst två fördelar med att använda designmönster. 1
Frågorna 5 14 är flervalsfrågor, skriv alla svar på ett blad! T5) Antag att klassen Model har instansmetoden doit. Efter satserna Model m1 = new Model(); Model m2 = m1; vad gäller för metodanropen m1.doit(); respektive m2.doit();? A) Endast m1.doit(); är tillåtet. m2.doit(); ger exekveringsfel. B) Endast m2.doit(); är tillåtet. m1.doit(); ger exekveringsfel. C) Både m1.doit(); och m2.doit(); är tillåtna och de två alternativen har exakt samma effekt. D) Både m1.doit(); och m2.doit(); är tillåtna men eftersom m1 och m2 refererar till olika Model - objekt så är arbetar doit med olika data i de två fallen. T6. Ett objekt som lyssnar efter händelser i en inmatningsruta, en TextField, i ett Javaprogram måste vara instans av en klass som A) ärver från en av klasserna Frame eller JFrame B) ärver från en av klasserna Panel eller JPanel C) definierar metoden actionperformed D) implementerar gränssnittet ActionPerformed T7) Vilket av följande påståenden om Javas interface är sant? A) Ett interface kan ärva från ett annat interface B) Ett interface kan ärva från en klass. C) Ett interface kan innehålla vanliga klassvariabler och instansvariabler D) Ett interface måste ha en konstruktormetod. T8) Vi sätter modifieraren private på konstruktorn till en klass som vi vill ha instanser av. Vi har bara skrivit en konstruktor. Vilket av följande påståenden är sant? A) Detta är fel, det kommer jualdrig att gå att anropa konstruktorn och därmed inte heller skapa några instanser av klassen. B) private på en konstruktor ignoreras av kompilatorn och det kommer att gå att anoropa konstruktorn ändå. C) En konstruktor med private kan inte anropas men vi kan jualltid skapa instanser m.h.a. den parameterlösa konstruktorn som alltid finns tillgänglig. D) private på en konstruktor används i implementationen av vissa designmönster, t.ex. om man vill begränsa hur många objekt av en klass som får skapas. T9) Javas paket awt för grafiska komponenter är uppbyggt enligt designmönstret A) Singleton B) Composite C) Template D) Abstract Factory 2
T10) Ett av följande påståenden om variabler och metoder är falskt. Vilket? A) I en parameterlös klassmetod får man använda klassens klassvariabler. B) I en parameterlös klassmetod får man använda klassens instansvariabler. C) I en parameterlös instansmetod får man använda klassens klassvariabler. D) I en parameterlös instansmetod får man använda klassens instansvariabler. T11) Vilket av följande påståenden om trådar i Java är sant? A) När man ska skapa en tråd själv måste man skriva en klass som ärver från Thread och implementerar gränssnittet Runnable B) När man vill starta en tråd så anropar man klassmetoden start() C) När man vill starta en tråd så anropar man instansmetoden start() D) Trådar kan endast användas i grafiska program, dvs skapas subklasser till klasser ut awt eller swing. T12) Vilket av följande påståenden om arbetsmetodiken Extreme Programming, XP är falskt? A) Programmerarna arbetar parvis. B) Skriv testprogram för en klass innan själva klassen skrivs. C) Använd allmänt gällande standard för namngivning av variabler och metoder, för fortmattering o.s.v. D) Tänk alltid på vilka ändringar av programmet som kan förväntas och försök programmera dessa i förväg. T13) Metoden ritafigur ritar en intressant figur. Metoden deklareras i en Applet och skall ha en skalfaktor, x- och y-värden för dess position samt ett Graphics - objekt som parametrar: void ritafigur (int skala, int xpos, int ypos, Graphics g) { // Här finns de satser som ritar figuren. I vilket av följande alternativ görs ett korrekt anrop av metoden ritafigur? Vi antar i samtliga fall att g är definierad där anropet sker och refererar till ett Graphics-objekt. Metodanropen görs i paint-metoden i den Applet där ritafigur är deklarerad. A) Figur f = ritafigur(20, 100, 200, g); B) int skala = 30; int xpos = 250; int ypos = 100; ritafigur(g); C) for (int x = 100; x <= 800; x +=50) ritafigur(40, x, 200, g); D) for (int x = 100; x <= 800; x +=50) ritafigur(g, 40, x, 200); 3
T14) Studera följande klasser. Vad blir utskriften från main-metoden? class X { void m () { System.out.print("Hej "); class Y extends X { void m () { System.out.print("Hopp "); class Test { public static void main (String[] a) { X x1 = new X(); X x2 = new Y(); Y y = new Y(); x1.m(); x2.m(); y.m(); System.out.println(); A) Hej Hej Hopp B) Hej Hopp Hopp C) Hej Hej Hej D) Hopp Hopp Hopp 4
Problemdel Uppgifterna är inte ordnade efter svårighetsgrad P1) (4p) Rita ett klassdiagram efter följande beskrivning: En skola består av (med komposition) en eller flera avdelningar. Varje avdelning tillhör precis en skola. En avdelning kan inte existera utan en skola. På en skola kan det gå noll eller flera studenter. Varje student går på precis en skola. En kurs är knuten till en eller flera avdelningar. En student följer noll eller flera kurser, en kurs läses av noll eller flera studenter. Varje avdelning har en eller flera lärare. En lärare kan tillhöra flera avdelningar men kan inte existera utan minst en avdelning. Chefslärare är en subklass till lärare. En chefslärare är chef för varje avdelning. Namn och riktningar på associationerna krävs inte men multipliciteter ska anges. Attribut och metoder behövs inte heller anges. 5
P2) DesignmönstretSingleton används som bekant när man vill ha en klass av vilken det endast finns en instans och det ska vara omöjligt för användare av klassen att skapa flera intstanser. I denna uppgift skall idén från Singleton användas för att skapa en klass Dvarg med precis 7 element (för att t.ex. använda i Sagospelet Snövit och de sju dvärgarna). Endast en dvärgegenskap behöver implementeras, dvärgens namn eller nummer. Välj själv! a (6p) Skriv klassen Dvarg. Det skall inte gå att skapa element av klassen med new. Klassen skall ha klassmetoden getdvarg(i) som ger en referens till objekt nr i för i =0, 1,..6. För alla andra värden på i ska metoden ge null. Instansmetoden tostring() skall ge en presentation av dvärgen i stil med "Jag är Glader". Klassen ska kunna testas med följande två program. DvargTest1 skall inte gå att kompilera därför att konstruktorn (med rätt parameter) ej går att anropa utifrån. class DvargTest1 { public static void main (String[] x) { Dvarg d = new Dvarg("Glader"); // eller new Dvarg(3); Testprogrammet class DvargTest2 { public static void main (String[] x) { for (int i=-1; i<= Dvarg.N; i++) System.out.println(Dvarg.getDvarg(i)); skall ge en utskrift liknande (det går bra med siffror i stället för namnen) null Jag är Blyger Jag är Butter Jag är Glader Jag är Kloker Jag är Prosit Jag är Toker Jag är Trötter null b) (2p)IDvarg klassen antar vi juatt antalet instanser är 7, klassvariabeln Dvarg.N har värdet 7. Hur kan man göra om man i en annan liknande klass vill att en användare ska kunna bestämma vilket antal instanser klassen ska ha innan man börjar använda instanserna? Antalet skall bara kunna sättas en gång. 6
P3) Städer har alltid ett namn och ett antal invånare. Vissa städer (t.ex. Falun och Örebro) är residensstäder där det bor en landhövding. Andra städer (t.ex. Skara och Strängnäs) är stiftsstäder och i varje sådan bor en biskop. a) (6p) Antag tills vidare att inga städer kan vara kombinerade stifts- och residensstäder. Denna situation kan beskrivas i Java med följande tre klasser. Skriv Javakod för de tre klasserna. Klasserna ska ha lämpliga konstruktorer. tostring() metoden ska för varje klass returnera ett String - objekt med all information: Först namn och antal invåndare. För residensstad skrivs dessutom t.ex. "residensstad, landshövding är Ingegerd Wernersson" och för stiftsstad skrivs t.ex. "stiftsstad, biskop är Hans Stiglund". Tänk på att inte upprepa kod! Stad private int antalinvanare private String namn public String tostring() Residensstad private String landshovding public String tostring() Stiftsstad private String biskop public String tostring() Om det i en annan klass finns ett array - objekt deklarerat Stad[] stad; som innehåller en blandning av vanliga städer, residensstäder och stiftsstäder så skall det vara möjligt att med skriva ut information om samtliga städer med for (int i=0; i< stad.length; i++) System.out.println(stad[i]); Utskriften skall bli olika för de olika typerna av städer. b) (1p) När satsen System.out.println(stad[i]); utförs anropas automatiskt metoden tostring(). Men det är olika metoder som anropas beroende på vilken typ objektet stad[i] har. Vad kallas detta? c) (1p) Skulle det vara bättre att låta klassen Stad vara abstrakt? Motivera svaret! 7
d) (2p, svår) Det finns städer som är både stifts- och residensstad, t.ex. Stockholm, Luleå, Växjö m.fl. I språk med multipelt arv kan för dessa skrivas en fjärde klass StiftsOchResidensstad som ärver från både Stiftsstad och Residensstad. Detta kan man inte göra i Java. Försök hitta på ett sätt att modellera alla stadstyperna så att typen Stad kan referera till objekt av alla 4 typerna någon typ kan referera till Residensstad samt StiftsOchResidensstad någon kan referera till Stiftsstad samt StiftsOchResidensstad typen StiftsOchResidensstad kan bara referera till objekt som är både Stiftsstad och Residensstad P4a) (7p) I ett program som används för bokning av bio- eller teaterbiljetter kan man ha användning för en klass om visar en plan över salongen med en numrerad ruta per plats och visar om platsen är bokad eller ej. Skriv en klass Salong som kan användas som en första prototyp för detta. Klassen ska visa upp en bild av salongen med namnet överst Vi antar lite förenklat att platserna kan representeras av en matris av objekt av Button eller en subklass till Button. När man skapar ett objekt ska salongens namn och antalet rader samt antalet platser per rad anges till konstruktorn. Platserna ska numreras enligt exemplet nedan. Platserna ska visas i en färg, t.ex. grönt, från början. Genom att klicka på en plats skall den anses bokad och markeras i annan färg, t.ex. rött. Om man klickar på en bokad (röd) plats ska den avbokas, dvs klickning ska i denna första version av klassen alltid betyda färgbyte. Numreringen av platserna ska göras så här: 33 34 35 36 37 38 39 40 32 31 30 29 28 27 26 25 17 18 19 20 21 22 23 24 16 15 14 13 12 11 10 9 1 2 3 4 5 6 7 8 För knapparnas färgbyten kan man ha nytta av metoderna setbackground(c) och getbackground() som båda finns i klassen Component. Den senare metoden returnerar en referens av typ Color P4b) (3p) Skriv ett program som testar klassen Salong genom att i ett Frame - objekt lägga in två salonger med olika namn och storlek. 8