-------------------------------------------------------------------- Tentamen Objektorienterad programmering med Java, 100814, 9-14 Lärare: Sven-Olof Nyström Email: svenolof@it.uu.se, xxxxxxxxxxxxxxxx@bredband.net (reserv) Telefon: xxxx - xx xx xx, xxx - xxx xx xx Instruktioner: - Skrivtid 5 timmar. - Oläsbara eller otydliga lösningar ger noll poäng per uppgift. - Om tvetydigheter uppstår, gör intelligenta antaganden och ange dem. - Några av frågorna handlar om ett program som du laddar ner här: . Kontrollera att du kommer åt programmet. - Du får söka information på nätet och i böcker. Du får *inte* ta hjälp från andra människor. - Svar *måste* motiveras. Detta är viktigt. Det blir mycket svårt för mig att ge poäng på lösryckta förklaringar eller program som lika gärna kunde vara tagna från webben. - Om stora bitar av ditt svar har plockats från någon källa, tala om det. - Vid skrivtidens slut, skicka dina svar som en textfil till min emailadress. - Om dina svar är uppdelade i flera filer, skicka dem packade som en tar- zip- eller rar-fil. Läs igenom hela tentan innan du börjar. Om du fastnar på en uppgift, gå vidare till nästa---uppgifterna är inte nödvändigtvis ordnade i svårighetsgrad. Om en uppgift består av flera deluppgifter och du fastnar på en av dem, gå vidare till nästa deluppgift---det kan hända att efterföljande deluppgifter kan lösas utan det fullständiga svaret på tidigare uppgifter. Maxpoäng: 100. =============================== Frågorna ============================= * 1. Referenssemantik (15) Kom ihåg att ge noggrann motivering! a) Betrakta följande kod. Vilka värden har x[0] samt y[0] vid positionerna (1), (2) och (3)? int[] x = new int [] {1,2,3}; int[] y = new int [] {4,5,6,7}; // (1) x = y; // (2) x[0] = 42; // (3) b) Betrakta följande kod. Först står en metoddefinition, sen en sekvens av Java-satser som innehåller ett anrop till metoden. Vad händer när metoden anropas?. Vilka värden har z[0] samt w[0] vid positionerna (a), (b) och (c)? Vilka värden har x[0] samt y[0] vid positionerna (d), och (e)? static void m(int[] z, int[] w) { // (a) z[0] = 17; // (b) z=w; // (c) } int[] x = new int [] {1,2,3}; int[] y = new int [] {4,5,6,7}; // (d) m(x,y); // (e) c) Vilken (om någon) är skillnaden mellan följande kodfragment? Vilken (eller vilka) är att föredra? List l; l = getNeighbours(); List l = new LinkedList(); l = getNeighbours(); List l = new ArrayList(); l = getNeighbours(); Vi antar att metoden getNeighbours() har en definition som börjar så här: List getNeighbours() { * 2. Problem vid arv (12) Anta att vi har en klass A och en klass B som ärver av A. Ibland kan en ändring i A påverka B så att programmet inte längre fungerar (eller ens kan kompileras). För vart och ett av de följande fallen (som beskriver ändringar i klassen A), förklara hur en ändring kan orsaka problem och ge exempel. a) Lägg till en instansvariabel deklarerad "protected". b) Ändra returtypen hos en metod deklarerad "protected" så att den returnerar en superklass till den ursprungliga. (Till exempel, ändra returtypen från Integer till Object.) c) Ändra returtypen hos en metod till en subtyp. (Till exempel, från Object till Integer.) d) Lägg till ett kontrollerat undantag till "throws"-klausulen hos en metod deklarerad "protected". e) Ändra en metod från "public" till "protected". f) Ändra en metod från default (package) till "public". * 3. Inkapsling och abstraktion (20) a) En vanlig rekommendation är att man bör deklarera alla instansvariabler i en klass som private. Vad uppnår man med det? Skissa på ett scenario där instansvariabler deklarerade som "public" leder till problem. b) Beskriv en situation där den interna representationen för en klass är tillgänglig utifrån trots att alla instansvariabler deklarerats "private". c) I objektorienterad programmering talar man om abstraktion och inkapsling. Förklara hur de är relaterade och hur de skiljer sig. d) Kommentera följande regel (som av vissa anses vara viktig för god OOP design). "En klass ska implementera en och endast en abstraktion." Förklara regeln. Ge gärna exempel på program som följer (eller inte följer) regeln. Motivera--eller argumentera för att regeln ej är rimlig. Det är OK att både ge argument för och emot. * 4. Får och vargar. (15) Ett program som simulerar en ekologisk värld med får och vargar (dock utan intelligens). Beskriv programmet med egna ord. Beskriv klasserna och deras ansvar, och hur olika klasser är relaterade. Vilka klasser är beroende av vilka? Vad tycker du om organisationen av programmet? Påpeka bättre och sämre aspekter av lösningen. * 5. Duplicerad kod i får och vargar (15) Det finns en del kod som upprepas i klasserna Sheep och Wolf. Vilken kod är det? Beskriv hur man kan eliminera den duplicerade koden. (Frågan är kort men kräver ett noggrannt svar för full poäng. Diskutera gärna för och nackdelar med olika alternativa lösningar.) * 6. Representation av position i får och vargar. (15) Beskriv hur hagen med de olika djurens positioner representeras i simuleringen. Jämför med representationen i den givna koden i inlämningsuppgift 4. Vad är skillnaden (respektive likheterna) vad gäller gränssnitt? (Metoderna har förstås olika namn, men det är inte det intressanta.) Hur tar man reda på positionen för ett visst djur? Hur tar man reda på vad som finns på en viss position? Hur tar man reda på vilka djur som finns i hagen? Skulle man kunna använda "Får och vargars" representation i en lösning av uppgift 4? * 7. Skumma frågor. (8) a) Kan en array innehålla sig själv? Ge exempel eller argumentera för att det inte går. b) Vad är problemet med följande kodfragment? (Anta att ... ersätts med kod som gör nåt intressant.) try { ... } catch (Exception e) {} c) Är det nån skillnad mellan följande deklarationer? int x; Integer x; Förklara skillnaden eller argumentera för att det inte finns nån skillnad. Ge (om möjligt) en bit kod som är kompilerbar med en av deklarationerna men inte med den andra. d) Givet två variabler s1 och s2 av typen String. Vad är skillnaden (om någon) mellan följande jämförelser: s1 == s2 s1.equals(s2) Ge exempel på när de ger olika resultat eller argumentera för att det inte finns nån skillnad.