Dagens tema Kapittel 8: Objekter og klasser Hva er objekter og klasser? Programmering med objekter Klassedeklarasjoner Generering av objekter Tilgang til elementer i objektene Objekt- og klassevariable Konstruktører Beskyttelse
Litt historie Datamaskinen ble oppfunnet i 1945. Det første programmeringsspråket (FORTRAN) kom i 1958. Midt i 1960-årene var programmene blitt store og det skapte problemer: Hvordan holde orden på mange variable? Tall og tekst er greit, men hvordan lagrer manenbilellerenpersoniprogrammet? Hvordan kan man skrive programmer som ligner mer på hvorledes vi mennesker tenker?
Simula 67 Løsningen kom fra to norske forskere: Kristen Nygaard og Ole-Johan Dahl De oppfant objektorientert programmering som etterhvert er blitt det dominerende programmeringsparadigme (dvs måte å programmere på). (Både C++ og Java bygger direkte på ideene til Dahl og Nygaard.)
Objekter og klasser Et system for trafikkinformasjon for T-banen i Oslo vil trenge informasjon om mange stasjoner: Sognsvann, Blindern,... data om tog: nr 1732 fra Sognsvann kl 11.01 til Mortensrud... Programmet må kunne representere disse objektene.
Alle stasjonene har mye felles; de er av samme klasse. Konklusjon Klasser er modeller/mønstre/oppskrifter for en type dataelementer. De skrives i programkoden. De finnes alltid i ett eksemplar når Java-programmet kjører. Objekter er instanser/enheter av en klasse. De oppstår når programmet kjøres: new Stasjon(); Programmet kan lage så mange objekter det måtte trenge.
Pekere til objekter For å få tilgang til objektene må vi ha pekere: class Stasjon { String navn; int moh; // meter over havet Stasjon maj, nat; maj = new Stasjon(); nat = new Stasjon();
Tilgang til innmaten i objekter Når vi har en peker til et objekt, kan vi få tilgang til innmaten (dvs data og metoder) med et «.»: nat.navn = "Nationaltheateret"; nat.moh = 4; System.out.println(nat.navn + " ligger " + nat.moh + " meter over havet.");
Programmering = design+koding Objektorientert programmering er tydelig todelt: Design er å finne hovedlinjene i programmet: Hvilke klasser trenger vi? Hvordan henger klassene sammen? Hvilke data trenger vi i hver klasse? Hvilke metoder må vi ha i klassene? Koding er å skrive programkode: Koding av angitte klasser og metoder. Valg av algoritmer (dvs teknikker). I dette kurset skal dere lære begge deler.
Eksempel: En bankkonto Design Vi trenger en klasse Konto for å representere en bankkonto. Den må (i vårt eksempel) inneholde opplysninger om kontonummeret, saldoen og eiers navn. Klassedeklarasjonen blir da: class Konto { // Her deklarerer vi tre objektvariable: int kontonummer, saldo; String eier; NB Det er vanlig å skrive klassenavn med stor forbokstav. Programkode På neste ark er et eksempel som bruker klassen Konto. NB Man kan godt ha mange klassedeklarasjoner i samme fil.
import easyio.*; class Konto { // Her deklarerer vi tre objektvariable: int kontonummer, saldo; String eier; class TestKonto { public static void main (String arg[]) { // Her deklarerer vi to pekere vi kaller // a og b. Merk at vi bruker et klassenavn // til å si hvilke typer av objekter // a og b kan peke på. Konto a, b; // Her bruker vi klassedeklarasjonen til // å lage to objekter: a = new Konto(); b = new Konto(); // Bruk objektene: a.kontonummer = 1; a.saldo = 1200; a.eier = "Per"; b.kontonummer = 2; b.saldo = a.saldo + 25; b.eier = "Kari"; Out skjerm = new Out(); skjerm.outln("konto " + a.kontonummer + " eies av " + a.eier + " og saldo er " + a.saldo); skjerm.outln("konto " + b.kontonummer + " eies av " + b.eier + " og saldo er " + b.saldo);
Eksempelprogrammet kan kompileres og kjøres. > javac TestKonto.java > java TestKonto Konto 1 eies av Per og saldo er 1200 Konto 2 eies av Kari og saldo er 1225
Objekt- og klassevariable Variable i en klassedeklarasjon vil forekomme i alle objekter. De er objektvariable. Unntak: Om det står static foran, vil de kun finnes i ett eksemplar, nemlig i klassen. Deerklassevariable. Eksempel: Biler Vi skal se på biler av merket Renault Scenic. Klassen Scenic kan se slik ut: class Scenic { // Her angir vi klassevariable: static int antgir = 5; // Her angir vi objektvariable: String regnummer; String eier;
Her er et program som bruker Scenic-klassen: import easyio.*; class TestScenic { public static void main (String arg[]) { Scenic min = new Scenic(); min.regnummer = "DK45178"; min.eier = "Dag"; Scenic jans = new Scenic(); jans.regnummer = "DJ12321"; jans.eier = "Jan"; Scenic nyest; if (min.regnummer. compareto(jans.regnummer)>0) nyest = min; else nyest = jans; Out skjerm = new Out(); skjerm.outln(nyest.eier + "s bil er nyest."); skjerm.outln("den har " + nyest.antgir + " gir"); skjerm.outln("nummeret er " + nyest.regnummer); NB Man kan godt legge klassedeklarasjoner på hver sin fil.
Kompilering og kjøring går slik: > javac Scenic.java TestScenic.java > java TestScenic Dags bil er nyest. Den har 5 gir Nummeret er DK45178
Konstruktører Det er kronglete å måtte skrive Scenic min = new Scenic(); min.regnummer = "DK45178"; min.eier = "Dag"; Scenic jans = new Scenic(); jans.regnummer = "DJ12321"; jans.eier = "Jan"; Det hadde vært greiere å kunne skrive Scenic2 min = new Scenic2("DK45178","Dag"); Scenic2 jans = new Scenic2("DJ12321","Jan"); Dette er mulig med konstruktører i klassen: Scenic2 (String num, String e) { regnummer = num; eier = e; De ligner på metoder men De har samme navn som klassen. De har ingen returtype.
Her er Senic med en konstruktør: class Scenic2 { // Her angir vi klassevariable: static int antgir = 5; // Her angir vi objektvariable: String regnummer; String eier; // Her er en konstuktør: Scenic2 (String num, String e) { regnummer = num; eier = e;
... og her er testprogrammet: import easyio.*; class TestScenic2 { public static void main (String arg[]) { Scenic2 min = new Scenic2("DK45178","Dag"); Scenic2 jans = new Scenic2("DJ12321","Jan"); Scenic2 nyest; if (min.regnummer. compareto(jans.regnummer)>0) nyest = min; else nyest = jans; Out skjerm = new Out(); skjerm.outln(nyest.eier + "s bil er nyest."); skjerm.outln("den har " + nyest.antgir + " gir"); skjerm.outln("nummeret er " + nyest.regnummer);
Kompilering kjøring er som før: > javac Scenic2.java TestScenic2.java > java TestScenic2 Dags bil er nyest. Den har 5 gir Nummeret er DK45178
Et stort eksempel: 8.11 Her et klassen Konto igjen, noe utvidet: class Konto { private static int nummer = 0; private int kontonummer, saldo; private String eier, adresse; Konto () { saldo = 0; bestemkontonummer(); Konto (String e, String adr, int s) { eier = e; adresse = adr; saldo = s; bestemkontonummer(); void bestemkontonummer () { nummer++; kontonummer = nummer; (Resten står på neste ark.)
void settinn (int innskudd) { saldo = saldo + innskudd; boolean taut (int uttak) { if (uttak > saldo) return false; saldo = saldo - uttak; return true; boolean overførtilannenkonto (Konto tilkonto, int beløp) { if (taut(beløp)) { tilkonto.settinn(beløp); return true; else return false; int gisaldo () { return saldo;
Kommentarer Private variable For å sikre mot programmeringsfeil, kan variable deklareres private. Da er de usynlige utenfor klassen, så kode som min.saldo vil gi denne kompileringsfeilen: LekBank2.java:11: saldo has private access in Konto min.saldo ^ (Noen purister mener at alle variable skal være private og kun skal leses og endres via «get-and-set»-metoder som gisaldo.)
Det finnes også andre beskyttelser: protected Elementer er kun synlig i subklassser (kommer senere). public Elementer er synlig i alle pakker. (Omtales ikke i dette kurset.) ingenting Elementer er synlig i samme pakke.
Et testprogram Dette programmet bruker Konto-klassen: import easyio.*; class LekBank { public static void main (String arg[]) { Konto min = new Konto("Dag","Nordstrand",1000); Konto idas = new Konto("Ida","Ila",2500); Out skjerm = new Out(); min.taut(200); skjerm.outln("min saldo er nå " + min.gisaldo()); if (min.overførtilannenkonto(idas,500)) { skjerm.outln("min saldo er " + min.gisaldo()); skjerm.outln("idas saldo er " + idas.gisaldo()); else skjerm.outln("ingen overføring til Ida"); if (min.overførtilannenkonto(idas,500)) { skjerm.outln("min saldo er " + min.gisaldo()); skjerm.outln("idas saldo er " + idas.gisaldo()); else skjerm.outln("ingen overføring til Ida");
Kjøring av testprogrammet: > javac Konto.java > javac LekBank.java > java LekBank Min saldo er nå 800 Min saldo er 300 Idas saldo er 3000 Ingen overføring til Ida