God oversikt over pensum med forklaringer, formler, vanlige feil og eksamenstips.
IN1010 Objektorientert programmering er et sentralt emne ved Institutt for informatikk, UiO, som bygger videre pa IN1000. Kurset undervises i Java og dekker hele spekteret av OOP: fra arv og polymorfisme via grensesnitt og generics til egendefinerte datastrukturer (lenkede lister, stabler, koer, traer) og flertrading. Eksamen er en 4-timers praktisk prove der du skriver Java-kode for hand eller digitalt.
Eksamen folger et fast monster: du far et sammenhengende scenario (skog med stier, hundeoppdrett, flyreservasjon, osv.) og skal bygge et komplett klassehierarki med 3-4 deloppgaver. Oppgavene tester alltid de samme kjerneemnene, men i ulike kontekster. Typisk vekting: klassehierarki og OOP (30-35%), datastrukturer og algoritmer (25-30%), simulering/hovedprogram (15-20%), og flertrading med synkronisering (10-15%).
Viktig: Du trenger ikke skrive kjorbar kode. Sensor vurderer om du viser forstaelse for OOP-prinsipper, korrekt bruk av arv/grensesnitt, og evne til a implementere datastrukturer fra bunnen av. Skriv tydelig, kommenter koden din, og vis at du forstar hvorfor du velger en bestemt designlosning.
Klassehierarkier med extends og abstract, metodeoverstyring med @Override, og polymorfisme der en superklassereferanse kan peke pa subklasseobjekter. Grunnmuren i all objektorientert programmering i Java.
Arv (inheritance) lar en klasse arve felt og metoder fra en annen klasse. Subklassen utvider superklassen med nyckelsordet extends. Java stotter kun enkel arv -- en klasse kan bare ha en direkte superklasse. All felles funksjonalitet legges i superklassen, mens spesialisert oppforsel defineres i subklassene.
Polymorfisme betyr at en referanse av typen superklasse kan peke pa et objekt av en subklasse. Nar du kaller en metode pa denne referansen, er det objektets faktiske type som bestemmer hvilken versjon av metoden som kjores. Dette kalles dynamisk binding (eller sen binding) og er en av de mest kraftfulle mekanismene i OOP. I praksis betyr det at du kan skrive kode som behandler alle objekter av en superklassetype likt, uten a vite den konkrete subklassen pa kompileringstidspunktet.
En abstrakt klasse kan ikke instansieres direkte -- du kan ikke skrive new AbstraktKlasse(). Den kan inneholde bade konkrete metoder (med full implementasjon) og abstrakte metoder (deklarert med abstract, uten kropp). Subklasser ma implementere alle abstrakte metoder, ellers ma de ogsa vaere abstrakte selv. Abstrakte klasser er ideelle nar du vil tvinge subklasser til a tilby en bestemt oppforsel, men samtidig dele felles kode.
Pa eksamen V2021 var klassen Sti en naturlig abstrakt klasse: alle stier har lengde og to endepunkter, men de konkrete typene (Kjerrevei, Natursti) er ulike. Pa V2021 var klassen Aktivitet ogsa abstrakt, med en abstrakt metode handling() som subklassen Turgaaer implementerte.
Nar du oppretter et objekt av en subklasse, kalles superklassens konstruktor forst via super(...). Hvis du ikke kaller super() eksplisitt, legger Java automatisk inn et kall til den parameterlose konstruktoren. Husk: super() ma vaere forste linje i konstruktoren. Dersom superklassen bare har en konstruktor med parametere, ma subklassen kalle super(parametere) eksplisitt -- ellers kompilerer ikke koden.
private: kun tilgjengelig i egen klasse -- bruk dette for instansvariabler. protected: tilgjengelig i egen klasse, subklasser og klasser i samme pakke -- nyttig nar subklasser trenger direkte tilgang. public: tilgjengelig overalt. Pakke-tilgang (ingen modifikator): tilgjengelig i hele pakken, men ikke utenfor. Pa V2021 ble det spesifisert at instansvariablene i Aktivitet ikke skulle vaere private fordi klassene Simulator og PrioKo trengte direkte tilgang (de la i samme pakke).
Nesten alle eksamener starter med a be deg tegne klassehierarkiet. Bruk UML-konvensjoner: rektangler for klasser, heltrukket pil fra subklasse til superklasse for arv, stiplet pil for interface-implementering. Abstrakte klasser og metoder markeres med kursiv skrift. Tegningen gir typisk 3% av totalpoengene og er enkle poeng.
// Abstrakt superklasse
abstract class Sti {
private int lengde; // meter
private Kryss ende1, ende2;
Sti(int lengde, Kryss e1, Kryss e2) {
this.lengde = lengde;
this.ende1 = e1;
this.ende2 = e2;
e1.leggTilSti(this);
e2.leggTilSti(this);
}
Kryss finnAndreEnde(Kryss denne) {
if (denne == ende1) return ende2;
return ende1;
}
int beregnGaaTid(int fart) {
return lengde / fart;
}
}
// Konkrete subklasser -- ingen forskjell annet enn navn
class Kjerrevei extends Sti {
Kjerrevei(int lengde, Kryss e1, Kryss e2) {
super(lengde, e1, e2);
}
}
class Natursti extends Sti {
Natursti(int lengde, Kryss e1, Kryss e2) {
super(lengde, e1, e2);
}
}// Sti-referanse kan peke pa bade Kjerrevei og Natursti
Sti[] stier = new Sti[3];
stier[0] = new Kjerrevei(500, kryss1, kryss2);
stier[1] = new Natursti(800, kryss2, kryss3);
stier[2] = new KjerreveiMedUtsikt(300, kryss1, kryss3, 5);
for (Sti s : stier) {
// Dynamisk binding: riktig versjon av metoden kalles
int tid = s.beregnGaaTid(80);
System.out.println("Tid: " + tid + " min");
// Bruk instanceof for a sjekke spesifikk type
if (s instanceof GodUtsikt) {
GodUtsikt u = (GodUtsikt) s;
System.out.println("Utsikt: " + u.hentUtsiktsVerdi());
}
}Nøkkelformler
Vanlige feil
Eksamenstips
Laster...