Komplett pensumoversikt for objektorientert programmering ved NTNU — med forklaringer, sentrale begreper, eksamenstips og vanlige fallgruver. Eksamensoptimalisert basert på tidligere eksamener.
Denne studieguiden dekker pensum i TDT4100 Objektorientert programmering ved NTNU. Kurset gir en grundig innføring i objektorientert programmering med Java: klasser og objekter, innkapsling, arv og polymorfisme, grensesnitt og abstrakte klasser, generiske typer og collections, unntakshåndtering, sentrale designmønstre (særlig observatør og delegering) samt testing og feilsøking (7,5 studiepoeng).
Eksamen er en 4-timers skoleeksamen (typisk kl. 9.00–13.00) der det eneste tillatte hjelpemiddelet historisk har vært læreboka Big Java av Cay S. Horstmann (hjelpemiddelkode C). Du må derfor kunne skrive korrekt Java-syntaks fra minnet og lese andres kode kritisk.
Oppgavesettet har en svært stabil flerdelt struktur (verifisert mot eksamenene 2013–2017, faglærere Hallvard Trætteberg / Rune Sætre). Et typisk sett bygger ett gjennomgående domene (f.eks. et spisested, en familie, en busstur, et skattesystem, en serietabell) opp gjennom delene:
private, final, static), uttrykkstyper, casting, og hvorfor felt er private. Implementer verdiklasser med konstruktør og get-metoder.List/Collection/Map, konstruktører, metoder med løkker, validering med unntak, sortering med Comparable/Comparator.Faste mønstre som går igjen på (nesten) hvert sett:
IllegalArgumentException — kommer hvert år.super(...) i konstruktør og @Override — kommer hvert år.assertEquals/assertTrue og riktig opprigging — kommer ofte.static hjelpemetoder uten objekttilstand.Lønnsom strategi: les hele settet før du starter (oppgavene bygger på hverandre), og husk at du kan bruke metoder fra tidligere deler selv om du ikke fikk dem helt riktige.
Hvordan definere klasser med felt, konstruktører og metoder i Java, skille klasse fra objekt, bruke this, static-medlemmer og toString, og velge riktig datatype for feltene.
En klasse er en mal som beskriver hvilke data (felt/instansvariabler) og hvilken oppførsel (metoder) objektene skal ha. Et objekt er en konkret instans opprettet med new, med egne verdier i feltene. Klassen er oppskriften, objektet er kaka.
public class Group {
private final int guestCount; // felt
public Group(int guestCount) { // konstruktor
this.guestCount = guestCount;
}
public int getGuestCount() { // metode
return guestCount;
}
}Konstruktøren har samme navn som klassen og ingen returtype. Den kalles automatisk av new og skal sette objektet i en gyldig starttilstand. Du kan ha flere konstruktører (overlasting), og en kan kalle en annen med this(...) som første linje:
public Question(String question, String answer, String... options) {
this(question, answer, Arrays.asList(options)); // delegerer
}this peker på objektet metoden kjører for. Vanligst brukt for å skille parameter fra felt med samme navn: this.guestCount = guestCount;. Kan også returneres for kjeding og brukes til this(...)-kall.
Eksamen vektlegger at du begrunner typevalg. Eksempler fra tidligere sett: et identifikasjonsnummer kan ligge i en String (enkel validering, plass til ledende nuller), pengebeløp i long (kan overstige int-grensen på ca. 2,1 mrd.), en prosent i double (ikke nødvendigvis heltall, f.eks. 3,5 %).
Et static-felt deles av alle objekter. Et klassisk eksamenstriks er en global teller for automatiske løpenummer:
public class Table {
private static int tableCounter = 1; // delt teller
private final int num;
private final int capacity;
public Table(int capacity) {
this.num = tableCounter++; // forste bord far 1, neste 2 ...
this.capacity = capacity;
}
public int getNum() { return num; }
}static-metoder kalles uten objekt (Klasse.metode()) og passer for hjelpemetoder som ikke leser eller endrer objekttilstand, og for valueOf-/fabrikkmetoder.
toString() gir tekstrepresentasjonen som brukes automatisk ved System.out.println(obj) og ved strengkonkatenering med +. Et program startes via public static void main(String[] args).
Lag en klasse Konto der hvert objekt får et unikt, automatisk kontonummer fra og med 1000, og der saldoen settes ved opprettelsen og ikke kan endres direkte utenfra.
public class Konto {
private static int nesteNummer = 1000;
private final int kontonummer;
private final double startsaldo;
public Konto(double startsaldo) {
this.kontonummer = nesteNummer++;
this.startsaldo = startsaldo;
}
public int getKontonummer() { return kontonummer; }
public double getStartsaldo() { return startsaldo; }
@Override
public String toString() {
return "Konto #" + kontonummer + " (" + startsaldo + " kr)";
}
}Her er nesteNummer static (én delt verdi), mens kontonummer og startsaldo er final instansfelt som er unike per objekt.
Nøkkelformler
public class Navn { felt; konstruktor; metoder } — klassedefinisjonpublic Navn(...) { this.felt = parameter; } — konstruktor (ingen returtype)this(...) som første linje — kall til annen konstruktor i samme klasseprivate static int teller = 1; + this.num = teller++; — automatisk lopenummerpublic static void main(String[] args) — programmets startpunktVanlige feil
Eksamenstips
Laster...