OO-eksempel I eksemplet er det deklarert tre klasser: 1) Fag (skal instansieres ett objekt for hvert fag) 2) Student (skal instansieres ett objekt for hver student) 3) Studenter (abstrakt klasse skal ikke instansieres men har statiske medlemmer som de andre objektene/klassene har tilgang til) Modellen ser slik ut: Studenter + antstudenter : int = 0 Klassenavn i kursiv = {abstract Atributt understreket = {static Operasjon i kursiv = {static - kode : String = "" - stp : int = 0 Fag + Fag(fagkode : String, studiepoeng : int) + div tilgangsmetoder() + hentantstudenter() : int Student - studnr : int = 0 - studnavn : String = "" - fag[] : Fag = Fag[5] - antfag : int = 0 + Student(nr : int, nvn : String) + finalize() : void + hentstudentnr() : int + settstudentnavn(nyttnavn : String) + hentstudentnavn() : String + hentantallfag() : int + nyttfag(fnyttfag : Fag) - oknavn(n : String) : Boolean DeltidsStudent - prosent : int = 50 + settstudieprosent(int nyprosent) : void + hentstudieprosent() : int Knut W. Hansson oo-eksempel.doc
BluJay BlueJay er et gratis program som er beregnet brukt i undervisning, og som kan vise forskjellen på en klasse og et objekt. Slik ser modellen ut i BlueJay: Klassene er definert slik: /** * Abstrakt klasse. Det kan altså ikke skapes objekter av denne klassen. * Klassen holder orden på hvor mange studenter som er skapt. (Det kunne også vært naturlig å ha en array * som pekte til hvert enkelt objekt, men da blir ekseplet for komplekst for formålet.) public abstract class Studenter { // Klasseattributter (merket "static") /** Antall studenter som er skapt. Burde vært privat, men er her laget public for enkelhets * skyld (dette bryter med prinsippet om informasjonsskjuling) public static int antstudenter = 0; //antall studentobjekter som er skapt // Klassemetoder /** Returnerer antall student-objekter public static int hentantstudenter(){ return antstudenter; Knut W. Hansson Side 2 av 5
/** * Klasse som skal instansieres (det skal lages objekter av den). * Eksemplet er enkelt uten inputkontroll o.l. public class Student { //Objektattributter det settes av plass til, én for hvert objekt private int studnr = 0; private String studnavn = ""; private Fag fag[] = new Fag[5]; private int antfag = 0; //Konstruktør/destruktør /** Konstruktør - for å skape et nytt objekt av denne klassen //Dette legger tekst inn i dokumentasjonen public Student(int studentnr, String studentnavn){ //sett attributtverdier studnr = studentnr; studnavn = studentnavn; //øk antall studenter for klassen Studenter.antStudenter++; /** Destruktør (virker ikke i BlueJay - blir ikke kalt opp). * Viser eksempel på handlinger som kan være nødvendige når et objekt slettes protected void finalize(){ //Reduser antall studenter Studenter.antStudenter--; //Tilgangsmetoder (funksjoner, operasjoner) /** Returnerer studentnummer. (Note: studentnummer kan ikke endres, derfor ingen "settstudentnr") public int hentstudentnr(){ return studnr; /** Endrer studentnavn public void settstudentnavn(string nyttnavn){ if (oknavn(nyttnavn))studnavn = nyttnavn; /** Returnerer studentnavn public String hentstudentnavn(){ return studnavn; /** Returnerer antall fag studenten tar public int hentantallfag(){ return antfag; /** Legger til et nytt fag som studenten tar public void nyttfag(fag nyttfag){ antfag++; //øk antall fag for studenten fag[antfag] = nyttfag; //pek til det nye faget //Hjelpemetoder (private - skal bare brukes av objektet selv) private boolean oknavn(string n){ return (n!= ""); Knut W. Hansson Side 3 av 5
/** * En klasse som arver * public class DeltidsStudent extends Student{ //Objektattributter det settes av plass til, én for hvert objekt private int prosent = 50; //Konstruktør/destruktør /** Konstruktør - for å skape et nytt objekt av denne klassen //Dette legger tekst inn i dokumentasjonen public DeltidsStudent (int studentnr, String studentnavn, int studieprosent){ super(studentnr,studentnavn); //kaller metaklassens konstruktør //settstudnr(nr); prosent = studieprosent; //Student(nr, String); //Kaller meta-konstruktør /** Destruktør (virker ikke i BlueJay - blir ikke kalt opp). * Viser eksempel på handlinger som kan være nødvendige når et objekt slettes protected void finalize(){ //Reduser antall studenter super.finalize(); //kaller metaklassens destruktør //Tilgangsmetoder (funksjoner, operasjoner) public void settstudieprosent(int nyprosent){ prosent = nyprosent; public int hentstudieprosent(){ return prosent; /** * En svært enkel fag-klasse uten tilgangsmetoder for enkelhets skyld. public class Fag { //Objektattributter private String kode = ""; private int stp = 0; //Konstruktør public Fag(String fagkode, int studiepoeng){ kode = fagkode; stp = studiepoeng; //Tilgangsmetoder er ikke implementert Knut W. Hansson Side 4 av 5
Gjennomgang 1) Tegne modellen på tavle, med kommentarer 2) Vise i BlueJay: a) Vise modellen b) Vise dokumentasjonen legg merke til hva som synes fra utsiden = grensesnittet. Legg også merke til kommentarene /** i koden som blir en del av dokumentasjonen. To nivåer: Frem til punktum og alt (under Details) c) Legg merke til at det ikke kan skapes objekt av klassen Studenter, siden det er abstract. d) Skap to fag e) Skap to studenter en heltidsstudent og en deltidsstudent. Sjekk at Studenter.antStudenter oppdateres. f) Merk hvilke metoder som er tilgjengelige for heltids- og for deltidsstudenten g) Knytt opp heltidsstudenten til begge fagene og deltidsstudenten til ett fag. h) Kjør tilgangsmetoder i) Inspiser objektene og legg spesielt merke til pekerne Knut W. Hansson Side 5 av 5