Abstrakt programmering. En Type

Like dokumenter
ADT og OO programmering

Repitisjonskurs. Arv, Subklasser og Grensesnitt

Det finnes ingenting. som kan gjøres med interface. men som ikke kan gjøres uten

TOD063 Datastrukturer og algoritmer

Algoritmer og datastrukturer Kapittel 3 - Delkapittel 3.1

STABLER OG REKURSJON. Abstrakte Data Typer (ADT) Stabler. ADT Stabel

INF Notater. Veronika Heimsbakk 10. juni 2012

Del 3: Evaluere uttrykk

Array&ArrayList Lagring Liste Klasseparametre Arrayliste Testing Lenkelister

INF1010 våren Arv og subklasser - del 2

Eksekveringsrekkefølgen (del 1) Oppgave 1. Eksekveringsrekkefølgen (del 2) Kommentar til oppgave 1. } // class Bolighus

INF1010 våren 2017 Onsdag 25. januar. Litt om unntak i Java

INF1010, 22. mai Prøveeksamen (Eksamen 12. juni 2012) Stein Gjessing Inst. for Informatikk Universitetet i Oslo

Post-it spørsmål fra timen (Arv og subklasser)

INF Seminaroppgaver til uke 3

INF1010 våren Arv og subklasser del 1

class Book { String title; } class Dictionary extends Book { int wordcount; } class CartoonAlbum extends Book { int stripcount; }

Kapittel 7: Mer om arv

INF1010 våren 2019 Onsdag 30. januar. Mer om unntak i Java (med litt repetisjon av I/O først)

Oppsummering. Kort gjennomgang av klasser etc ved å løse halvparten av eksamen Klasser. Datastrukturer. Interface Subklasser Klasseparametre

Løsningsforslag Test 2

Konstruktører. Bruk av konstruktører når vi opererer med "enkle" klasser er ganske ukomplisert. Når vi skriver. skjer følgende:

Arv. Book book1 = new Book(); book1. title = "Sofies verden" class Book { String title; } class Dictiona ry extends Book {

INF1010 våren 2008 Uke 4, 22. januar Arv og subklasser

Array&ArrayList Lagring Liste Klasseparametre Arrayliste Testing Lenkelister Videre

Kapittel 8: Programutvikling

1- og 2-veis Innkapsling Java Stabel Kø Prio-kø Iterator. Enveis- og toveislister Innkapsling («boxing») (Big Java 6.8.5)

Kapittel 9: Sortering og søking Kort versjon

1- og 2-veis Innkapsling Java Stabel Kø Prio-kø Iterator. Enveis- og toveislister Innkapsling («boxing») (Big Java 6.8.5)

INF1010 våren Arv og subklasser del 1

IN1010 våren 2018 Tirsdag 15. mai. Repetisjon av subklasser og tråder. Stein Gjessing Institutt for informatikk Universitetet i Oslo

TDT4100 Objektorientert programmering

Læringsmål for forelesningen

Eksamen. Objektorientert Programmering IGR 1372

Innhold. Forord Det første programmet Variabler, tilordninger og uttrykk Innlesing og utskrift...49

Læringsmål for forelesningen

INF1010 våren Arv og subklasser - del 2

INF1010 våren januar. Objektorientering i Java

UNIVERSITETET I OSLO

INF1010 Arv. Marit Nybakken 2. februar 2004

IN1010. Fra Python til Java. En introduksjon til programmeringsspråkenes verden Dag Langmyhr

INF1010 våren 2018 tirsdag 23. januar

Obligatorisk oppgave 4: Lege/Resept

Generiske mekanismer i statisk typede programmeringsspråk

IN1010 våren januar. Objektorientering i Java

TDT4100 Objektorientert programmering

2 Om statiske variable/konstanter og statiske metoder.

IN 211 Programmeringsspråk. Java. på 20 enkle ark. spesielt for de som kan. Simula. (og gjerne litt C) Ark 1 av 20

Fra Python til Java. En introduksjon til programmeringsspråkenes verden. Dag Langmyhr

Innhold uke 4. INF 1000 høsten 2011 Uke 4: 13. september. Deklarasjon av peker og opprettelse av arrayobjektet. Representasjon av array i Java

public static <returtype> navn_til_prosedyre(<parameter liste>) { // implementasjon av prosedyren

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

INF 1010, vår 2005 Løsningsforslag uke 11

INF1010 våren Arv, subklasser og grensesnitt - del 2

Introduksjon til objektorientert programmering

public static <returtype> navn_til_prosedyre(<parameter liste>) { // implementasjon av prosedyren

Stein Gjessing, Institutt for informatikk, Universitetet i Oslo

IN1010. Fra Python til Java. En introduksjon til programmeringsspråkenes verden Dag Langmyhr

INF1000 EKSTRATILBUD. Stoff fra uke 1-5 (6) 3. oktober 2012 Siri Moe Jensen

Leksjon 7. Filer og unntak

Jentetreff INF1000 Debugging i Java

INF1010 våren Arv og subklasser del 1 (pluss litt I/O og unntaksbehandling)

UNIVERSITETET I OSLO

Kapittel 11: Unntakshåndtering. Java som første programmeringsspråk

Kapittel 11: Unntakshåndtering. Java som første programmeringsspråk

En klasse som arver, eller selv deklarerer en abstrakt metode, må deklareres som abstrakt.

UNIVERSITETET I OSLO

Videregående programmering 6

Forkurs INF1010. Dag 3. Andreas Færøvig Olsen Gard Inge Rosvold Institutt for Informatikk, 15.

OPPGAVE 1 OBLIGATORISKE OPPGAVER (OBLIG 1) (1) Uten å selv implementere og kjøre koden under, hva skriver koden ut til konsollen?

NB!!! Veldig korte svar er gitt her. Disse burde det vært skrevet mer på ved en eksamen..

programeksempel Et større En større problemstilling Plan for forelesingen Problemstillingen (en tekstfil) inneholdt ordet "TGA"

Eks 1: Binærtre Binærtretraversering Eks 2: Binærtre og stakk

2 Om statiske variable/konstanter og statiske metoder.

Forklaring til programmet AbstraktKontoTest.java med tilhørende filer Konto.java, KredittKonto.java, SpareKonto.java

IN1010 V19, Obligatorisk oppgave 2

LO191D/LC191D Videregående programmering

PG4200 Algoritmer og datastrukturer Forelesning 5 Implementasjon av lister

Stein Gjessing. Institutt for informatikk. Universitetet i Oslo. Institutt for informatikk

Gjøre noe i hele treet = kalle på samme metode i alle objekten. Java datastruktur Klassestruktur

Kapittel 9: Sortering og søking Kort versjon

Eksamen i emnet INF100 Grunnkurs i programmering (Programmering I) og i emnet INF100-F Objektorientert programmering i Java I Løsningsforslag

UNIVERSITETET I OSLO

Stack. En enkel, lineær datastruktur

INF1000 (Uke 5) Mer om løkker, arrayer og metoder

Dagens tema: Sjekking

Kapittel 13: Unntakshåndtering

INF1010 våren Arv og subklasser - del 2

Mål med kurset. Java i INF Dagens tema. GUI med Swing. Dokumentasjon

Programmering i C++ Løsningsforslag Eksamen høsten 2005

Tillatte hjelpemidler: alle skrevne og trykte. Antall sider: 2 (+ 1 side vedlegg, bakerst). Oppgave 1 [25%]

Kapittel 8: Sortering og søking

Dagens tema: Mer av det dere trenger til del 1

Introduksjon til objektorientert. programmering. Hva skjedde ~1967? Lokale (og globale) helter. Grunnkurs i objektorientert.

Kapittel 13: Unntakshåndtering

Forkurs INF1010. Dag 3. Andreas Færøvig Olsen Eivind Storm Aarnæs

< T extends Comparable<T> > Indre klasser mm. «Det du bør ha hørt om før oblig 4»

Kapittel 9: Sortering og søking Kort versjon

INF1010 Eksamenstips. Løsningsforslag prøveeksamen del 1.

Transkript:

Abstrakt programmering... ok, i JAVA, dvs. i-110 med mer struktur I. TYPER,DATA TYPER OG ABSTRAKTE DATA TYPER I.1 ADT = grensesnitt (Type) : synlig HVA Interface I.2 DT = grensesnitt + implementasjon på en DS Class : HVA + HVORDAN I.3 DS = intern organisering av data : usynlig HVORDAN I.4 Bruk, Dokumentasjon og Implementasjon av ADT I.5 Package = en samling av tilhørende ADT II. ARV OG STERK TYPING II.1 Arv, overskriving, overlasting og polymorfisme Synlighet: private, public, protected enkel arv II.2 Abstract class = DT med delvis implementasjon II.3 Interface multipel typing (arv av grensesnitt) III.BRUK OG TILPASSING III.1 import, pakker, klassehierarki og Javadoc III.2 Arv III.3 Casting III.4 Exceptions i-120 : 8/25/98 2. Abstraksjon i JAVA: 1 En Type boolean, char, String, int, double boolean a, b; a && b!b false b int x, y; x + y x/y String s, t; s.equals(t) s+ c s.equals(a) t+x Primitive DataTyper (i et programmeringsspråk) er implementert (HVORDAN?) men det eneste viktige for programmerer er HVA han kan gjøre med dem PUBLIC CLASS STAB {public Object[] elems; int noe; public Stab() {elems= new Object[10]; noe=-1; public void push(object o) { noe++; elems[noe]= o; public Object peek() { if (!empty()) return elems[noe]; else return null; public Object pop() { noe--; return elems[noe+1]; public Object empty() { return noe < 0; introduserer en ny DataType utvider språket Stab p,r; p=new Stab(); p.push(new Integer(5)) r=new Stab(); p.equals(r); p.push(5) r.noe= 5; if (!r.empty()) i-120 : 8/25/98 2. Abstraksjon i JAVA: 2

vi lager Verktøy enkapslet Data Struktur Grensesnitt dvs. Data Typer som brukes av (andre) programmerere public class Stab {private Object[] elems; private int noe, max=10; public Stab() { elems= new Object[max]; noe=-1; public void push(object o) { if (noe==max-1) { Object[] temp= new Object[max]; Copy(elems, tab); max= 2max; elems= new Object[max]; Copy(tab,elems); noe++; elems[noe]=o; public Object peek() { if (!empty()) return elems[noe]; else return null; public Object pop() { if (!empty()) { noe--; return elems[noe+1]; else return null; public boolean empty() { return noe < 0; private Copy(Object[] f, Object[] t) { for (int k=0; k<f.length; k++) t[k]=f[k]; public class Stab {private Object[] elems; private int noe; public Stab() {elems=new Object[10]; noe=-1; public void push(object o) { noe++; elems[noe]== o; public Object peek() { if (!empty()) return elems[noe]; public Object pop() { noe--; return elems[noe+1]; public boolean empty() { return noe < 0; import Stab; public class C { programmerer Stab s= new Stab(); i-120 : 8/25/98 s.push(new Intger(5)); 2. Abstraksjon i JAVA: 3. public class Stab { public Stab() public void push(object o) public Object peek() public Object pop() public boolean empty() her: bruker = Data Type = boolean, char, Set, Grensesnitt operasjoner tilgjengelig for bruker som er implementert på en bestemt + Data Struktur privat for Data Typen, dvs. skjult for bruker han kan forandre på tilstanden i DS kun v.hj.a. grensesnitt-operasjoner NB! Bruker er interesert i importerer kun grensesnittet Interface = en Abstrakt Data Type kun deklarasjoner av grensesnitt operasjoner med dokumentasjon!!! / LIFO kø av vilkaarlige Objekter public interface Stack { // ingen konstruktører / legger nye Objekter på toppen av stabel @param o Objektet som skal settes inn public void push(object o); / fjerner top (siste) Objektet fra stabel @return top Objektet null hvis empty() public Object pop(); / returnerer (uten å fjerne) top Objektet fra stabel @return top Objektet null hvis empty() public Object peek(); / @return true hviss stabel er tom public boolean empty(); importeres og programmeres med (brukes) som alle andre Data Typer... men : har ingen konstruktører nye objekter kan ikke opprettes skal nye objekter opprettes, må man bruke en implementasjon av interface i-120 : 8/25/98 2. Abstraksjon i JAVA: 4

Javadoc / LIFO kø av vilkaarlige Objekter første Objektet er det som ble innsatt sist @author Michal Walicki @version 1.2, Aug 19 1998 @see Stack public class Stab implements Stack { / legger nye Objekter på toppen av stabel @param o Objektet som skal settes inn public void push(object o); / fjerner top (siste) Objektet fra stabel @return top Objektet null hvis empty() public Object pop(); / returnerer (uten å fjerne) top Objektet fra stabel @return top Objektet @exception NullPointerException kastes hvis empty() public Object peek(); / @return true hviss stabel er tom public boolean empty(); > javadoc Stab.java i-120 : 8/25/98 2. Abstraksjon i JAVA: 5 2 ( (4 1) + 6 ) Bruk av Interface 2 + 4 1 6 polsk notasjon ( 2, +( (4,1), 6 )) 2 + 6 2 4 1 6 + omvendt polsk notasjon Evaluer et aritmetisk uttrykk gitt i omvendt polsk notasjon import Stack; int Opolish(Stack op) { o = op.pop(); if (o er et tall) return o; else if (o er ) { a1= Opolish(op); a2= Opolish(op); return a1 a2; else if (o er -) { a1= Opolish(op); a2= Opolish(op); return a2 a1;. 4 1 + 6 1 4 2 op Les et aritmetisk uttrykk i polsk notasjon og evaluer / Les fra venstre og push hvert symbol på stabel po Reverser stabel: while (!po.empty()) op1.push(po.pop());!! får omvendt rekkefølge! return Opolish(op1); tilpasset, f.eks: if (o er ) { a1= Opolish(op1); a2= Opolish(op1); return a1 a2; 6 1 4 + 2 po 2 + 4 1 6 op1 i-120 : 8/25/98 2. Abstraksjon i JAVA: 6

Implementasjon av Interface en Stabel Data Type public class Stab IMPLEMENTS STACK { private Object[] elems; private int noe, max=10; public Stab() { elems= new Object[max]; noe= -1; public Object peek() { if (empty()) return null; else return elems[noe]; public void push(object o) { if (noe=max-1) { Object[] temp= new Object[max]; Copy(elems, tab); max= 2max; elems= new Object[max]; Copy(tab,elems); noe++; elems[noe]= o; public Object pop() { if (empty() return null; else { noe--; return elems[noe+1]; public boolean empty() { return noe < 0; / @param fra.lenght <= til.length private Copy(Object[] fra, Object[] til) { for (int k=0; k<fra.length; k++) til[k]= fra[k]; i-120 : 8/25/98 2. Abstraksjon i JAVA: 7 public interface Stack import Stack; public class Stab import Stack; public class Stab import Stack; public class Stab { / evaluerer aritmetiske uttrykk implements Stack / evaluerer aritmetiske uttrykk implements Stack / representert evaluerer aritmetiske som stabler uttrykk for { implements Stack bruker kun Stack interface! representert som stabler for { polsk representert notasjon som stabler for { polsk notasjon public class polsk EvalPol notasjon { public class EvalPol { public interface IO public class IO / public reverserer class stabel EvalPol { kun for å opprette et objekt { / reverserer stabel { /@param reverserer s stabel stabel bruker Stack interface! @param s stabel public class IOc @return @param s reversert stabel stabel @return reversert stabel @return reversert stabel import Stab; implements IO{ public Stack rev(stack s) { import Stab; public Stack rev(stack s) { import Stab; public Stack rev(stack s) { / import håndterer Stab; aritmetiske uttrykk / evaluerer utrykket i Stabel / håndterer aritmetiske uttrykk / evaluerer utrykket i Stabel / håndterer aritmetiske uttrykk / evaluerer utrykket i Stabel / leser leser håndterer og parser og parser aritmetiske dem, også dem, også uttrykk bygger @param s stabel bygger @param s stabel leser og parser dem, også bygger @param s stabel stabler stabler leser tilsv. tilsv. og parser polsk notasjon polsk dem, notasjon også @return integer verdi bygger @return integer verdi stabler tilsv. polsk notasjon public @return int eval(stack integer verdi s) { public class stabler Parser tilsv. { polsk notasjon public int eval(stack s) { public class Parser { public int eval(stack s) { public class Parser { / public bygger class stabel Parser for uttrykk { / bygger stabel for uttrykk / bygger stabel for uttrykk import Parser; import EvalPol; import IO; import IOc; / @param @param bygger sstabel streng s streng for uttrykk med et korrekt med et korrekt @param s streng med et korrekt @param s aritmetisk aritmetisk streng med uttrykk public class BRUK { uttrykk et korrekt @return polsk-notasjon aritmetisk uttrykk @return polsk-notasjon aritmetisk uttrykk stabel private EvalPol ep= new EvalPol(); stabel @return polsk-notasjon stabel public public @return Stack tostack(string Stab tostack(string polsk-notasjon s) { s) stabel private Parser pars= new Parser();..Stack public Stab tostack(string s) { public t=new Stab s= Stab Stab() new tostack(string return t; Stab(); s) { private IO i= new IOc(); Stab s= new Stab(); / sjekker Stab om s= utrykket new Stab(); er korrekt / sjekker om utrykket er korrekt public static void main(string arg[]) / sjekker om utrykket er korrekt / @param @param sjekker s strengen s om strengen utrykket som som er skal skal korrekt sjekkes sjekkes { BRUK b= new BRUK(); @param s strengen som skal sjekkes @return @param true true s hviss strengen korrekt hviss korrekt som skal sjekkes public BRUK() { @return true hviss korrekt public public @return boolean boolean true ok(string hviss ok(string korrekt s) { s) { String s= i. les(); public boolean ok(string s) { public boolean ok(string s) { if (pars. ok(s)) int z= ep. eval(pars. tostack(s)); i-120 : 8/25/98 2. Abstraksjon i JAVA: 8

Package En ADT (interface) samler noen relaterte funksjoner Dens implementasjon implementerer disse på en valgt Data Struktur Flere ADT er og DT er vil ofte utgjøre en helhet en pakke for håndtering av spesielt sett av problemer. 1. Opprett i din hjemmekatalog en underkatalog og kall den, f.eks. Pakker alle dine pakker skal ligge i denne katalogen 2. I Unix, kjør kommando > setenv CLASSPATH $HOME/Pakker : /usr/java/lib (dette kan legges til din.cshrc filen) 3. Når du lager en ny pakke, si, niceio opprett katalog niceio i katalogen Pakker alt som hører til niceio -pakken skal legges i katalogen $HOME/Pakker/niceIO/ enhver fil klass.java i denne katalogen skal starte med package niceio ; 4. For å bruke en pakke, niceio, i en klass, skriv import niceio. ; på toppen før public class klass { i filen klass.java For å bruke bare en spesifikk klasse, terminalio, fra denne pakken: import niceio.terminalio ; 5. F.eks. java.awt er en pakke for grafisk brukergrensesnitt; alle dens klasser ligger i katalogen /usr/java/src/java/awt du bruker den/importerer ved å starte din klass.java med import java.awt. ; i-120 : 8/25/98 2. Abstraksjon i JAVA: 9 Klasse-synlighet Klasse A deklarert: public default/ pakke i samme pakken Ja Ja i andre pakker Ja Nei Ingen adgangsmodifikator for klassen. En public-klasse er tilgjengelig i alle andre pakker, dvs er synlig der pakken den er deklarert i er synlig. Høyst én public-klasse pr. fil. En klasse uten public-synlighetsmodifikator er kun synlig i den pakken den er deklarert i, dvs klassen har package-synlighet. package niceio; public class Allmen { // synlig i andre pakker der denne pakken er synlig. // class Gradert { // kun synlig i pakken den er definert i. // i-120 : 8/25/98 2. Abstraksjon i JAVA: 10

Klasse A, medlemmer deklarert : og forsøkt brukt i: samme pakken andre pakker Synlighet av medlemmer: variabler og metoder ingen adgangsmodifikator public default/ pakke protected Subklassen kan ikke aksessere protected medlemmer i instanser av superklassen, bare i instanser av seg selv og sine subklasser. ingen pakke-navn medfører "default" pakken som vanligvis er innværende katalog i filsystem-hierarkiet. private klasse A Ja Ja Ja Ja subklasse B Ja Ja Ja Nei ikke-subklasse C Ja Ja Ja Nei subklasse D Ja Nei Ja Nei ikke-subklasse E Ja Nei Nei Nei package niceio; public class Allmen { // synlig der niceio er synlig. public Allmen() {.. // alle kan opprette nye instanser protected int minmax; // jeg har minmax og mine barn har sine private void decmax() {.. // bare jeg kan se og minke Max public int Max(); // men alle kan se dens verdi protected void incmax() {.. // jeg kan øke minmax, // og mine barn kan øke sine i-120 : 8/25/98 2. Abstraksjon i JAVA: 11 Oppsummering av I. ADT Vi programmerer ADT er moduler som samler noen relaterte funksjoner et endelig program er bare en sammensetting av forskjellige moduler En modul brukes kun gjennom grensesnitt en modul skiller skarpt mellom grensesnitt og implementasjon (intern Data Struktur, valgte algoritmer og deres implementasjon) modulens Data Struktur skal være private skjult for brukeren enhver modul burde implementere en designert interface kun moduler som oppretter nye objekter av en Interface bruker konkret Data Type (class) som implementerer en interface andre burde bruke minst mulig konkrete Data Typer og mest mulig ADT (interface) i-120 : 8/25/98 2. Abstraksjon i JAVA: 12

II. OO Arv synlighet binding type hvem Grensesnitt public interface alle Klasser som bruker-definerte typer public class alle class i samme pakken Klasse-medlemmer public void method alle private int meth/var kun jeg char meth/var i samme pakke protected String meth/var jeg og subklasser også i andre pakker Abstrakte klasser abstract class/meth kan ikke instansieres opprettes nye Objekter har klasse en abstract-method må den selv være abstract final class/meth kan ikke ha barn ingen subklasser en ikke-final klasse kan ha final-method native method skrevet i et annet programmeringsspråk i-120 : 8/25/98 2. Abstraksjon i JAVA: 13 Abstract class = en mellomting mellom en interface og en super-klasse innfører en ny type (som inteface eller class) kan ha Data Struktur og implementasjon av (noen) metoder har minst en abstrakt metode kan ikke instansieres, selv om kan definere konstruktører public interface Srt{ int[] sort() ; void seta(int[] X) ; public data implementerer privt/protectd har kan grensesnitt struktur metoder medlemer konstruktr instansieres kun final interface + public variable kan ha minst 1 abstract class + så mye abstract + + / du vil / + ellers super-class + + + + + + public abstract class Srt { protected int[] A; protected void swap(int i, int j) { if (i < A.length && j < A.length) {int k= A[i]; A[i]=A[j]; A[j]=k; public void seta(int[] X) { public abstract int[] sort(); tvinger implementasjon i enhver ikke-abstrakt subklasse public class Srt { protected int[] A; public Srt() { protected void swap(int i, int j) { public void seta(int[] X) { public int[] sort() { return A; en dum subklasse og enhver instans kan bruke denne i-120 : 8/25/98 2. Abstraksjon i JAVA: 14

extends OVERSKRIVER TOSTRING() int { return 20504; String tostring { return + reg. +; String tostring { return ; Person Ingen multipel arv en klasse kan extend kun én (super)klasse OVERSKRIVER TOSTRING() int { return 402004; String tostring { return + int. +; Student Ansatt? jeg som Student eller som Ansatt?? er min som hos Student, Ansatt eller Person? AnsStd men... i-120 : 8/25/98 2. Abstraksjon i JAVA: 15 interface Person implements extends interface Person Multipel typing en klasse kan implement mange interface er interface Student interface Ansatt Student Ansatt public class AnsStd extends Stud AnsStd // dermed implements // Person og Student implements Ans { i interface Student og Ansatt må ha samme spesifikasjon (kun 1 i AnsStd) eller tillate overlasting (1+1 = 2 i AnsStd) i-120 : 8/25/98 2. Abstraksjon i JAVA: 16 Stud AnsStd Ans

Overskriving vs. overlasting Overskriving (overriding) : samme navn, samme parametre en metode fra superklasse skrives om på nytt public class Super { public int tall() { return 100; public class Sub extends Super { public int tall() { return 50; public int talls() { return super.tall(); Overlasting (overloading) : samme navn, forskjellige parametre samme metodenavn brukes igjen med forskjellige parametre public class Ov { public int tall() { return 50; public int tall(int k) { return k+1; / public char tall() { er ulovlig!! men public char tall(int k, char c) { er ok (sub- eller superklasser av parametere i metoden som overlastes kan brukes) i-120 : 8/25/98 2. Abstraksjon i JAVA: 17 Dynamisk binding Statisk overlasting public class Point{ public void hei(){ public boolean equal(point x){ public class ColorPoint extends Point{ public void hei(){ public boolean equal(colorpoint x){ // 1h // 1e // 2h // 2e Point p1 = new Point(); Point p2 = new ColorPoint(); ColorPoint cp = new ColorPoint(); A. p1.hei(); // 1h B. p2.hei(); // 2h C. cp.hei(); // 2h Overskrevne metoder bindes dynamisk (run-time) 1. p1.equal(p1); 2. p1.equal(p2); 3. p2.equal(p1); 4. p2.equal(p2); 5. cp.equal(p1); 6. cp.equal(p2); 7. p1.equal(cp); 8. p2.equal(cp); 9. cp.equal(cp); // 2e Overlastede metoder bindes statisk (compile-time) i-120 : 8/25/98 2. Abstraksjon i JAVA: 18

Arv: oppsummering tillatter å samle felles egenskaper i en abstrakt superklasse og dermed designe mer abstrakte programmer som avhenger kun av de relevante, abstrakte egeneskaper kan brukes på objekter av nye, spesifikke subklasser public class mittprogram { void proc(point p) { public class Point { public class ColorPoint extends Point { Dog: disse kvalitetene sikres utelukkende gjennom type-arv (grensesnitt) og kan ivaretaes også ved bruk av interface (implements er ren arv av type) OO-Arv innebærer i tillegg implementasjon-arv av operasjoner og dermed må håndere ting som overskriving/overlasting og forbyr multipel arv (extends er arv av implementasjon og type) i-120 : 8/25/98 2. Abstraksjon i JAVA: 19 III. Bruk og tilpassing Bruk importer kun de pakker/klasser som du trenger vær obs på klassehierarki Javadoc viser bare metoder deklarert i klassen dermed ikke fullstendig grensesnitt for klassen men viser hvilke klasser denne arver fra Gjenbruk og Tilpassing Arv, overlasting, overskriving Parametrisering Kast Unntak i-120 : 8/25/98 2. Abstraksjon i JAVA: 20

/ LIFO kø av vilkaarlige Objekter public interface Stack { void push(object o); Object pop(); Object peek(); boolean empty(); Kast Leser (fra terminal) : 2 4 1 6 + og push er på stabel en sikringsmekanisme parameter -type tillater å lage Stack[String] Stack[Integer] op Leser hva? Si en String, som er passelig avgrenset, dvs. etterfølgende kall til lestoken() vil returnere: 2, 4, 1,, 6, +, + 6 1 4 2 / while (mer) { String s= lestoken(); op.push(s); import Stack; int Opolish(Stack op) { o = op.pop(); if (o er et tall) return o; else if (o er ) { a1= Opolish(op)); a2= Opolish(op); return a1 a2; else. import Stack; int Opolish(Stack op) { String o = (String) op.pop(); if (parseint(o)) return toint(o); else if (o.equals( )) { a1= Opolish(op); a2= Opolish(op); return a1 a2; else. Vet du ikke hvilken klasse Objekter fra stabelen tilhører kan du bruke if (o instanceof String) else if (o instancof Klasse) i-120 : 8/25/98 2. Abstraksjon i JAVA: 21 Tilpassing (adapter klasser) public interface Stack { void push(object o); Object pop(); Object peek(); boolean empty(); public class Stab implements Stack { void push(object o) { Object pop() { Object peek() { boolean empty() { Men jeg vil nå bare ha en Stabel med String.. public class StringStab extends Stab { void spush(string o) { push(o); String spop() {return (String) pop(); String speek() { return (String) pop(); i-120 : 8/25/98 2. Abstraksjon i JAVA: 22

Robusthet Feiltoleranse: evnen til å motstå angrep fra ytre og indre fiender. Ytre fiender (brukere og sluttbrukere) : brukere med fingertrøbbel feil bruk av parameterlister kan oppdages ved å kontrollere inndata er de gyldige (oppfyller forkrav, invarianter)? er de rimelige (selv urimelige data må kunne godtas) Indre fiender (interne i programmet) : feil som medfører avbrudd feil i programkode som medfører subtile feil i resultatene (brudd på invarianter, uinitierte variable, evige løkker, avrundingsfeil, typekonverteringsfeil) Robusthet økes ved defensiv programmerig: legg inn tester for å oppdage feil gi melding om hva feilen er og hvor den oppsto prøv å korrigere for feil slik at programmet kan fullføre med nyttige resultater dø ærerikt Ved modulær (abstrakt) programmering: enten reager til feil så snart den oppdages eller signaliser til en som kaller metoden der feilen oppdages i-120 : 8/25/98 2. Abstraksjon i JAVA: 23 Unntak (Exception) For systematisk og modulær feilhåndtering public class Stab IMPLEMENTS STACK { private Object[] elems; private int noe, max=10; public Object peek() { if (empty()) return null; else return elems[noe]; public Object pop() { if (empty()) return null; else { noe--; return elems[noe+1]; istedenfor slike spesielle objekter, markerer man uvanlige/feil situasjoner ved å kaste unntak bruker av Stab-klassen må kjenne til alle spesielle objekter som kan returneres i feilsituasjoner! Disse er ikke beskrevet i interface! public interface STACK { Object peek() throws EmptyStackExc; Object pop() throws EmptyStackExc; public class Stab IMPLEMENTS STACK { public Object peek() throws EmptyStackExc { if (empty()) throw new EmptyStackExc( tom stabel ); else return elems[noe]; public Object pop() throws EmptyStackExc { if (empty()) throw new EmptyStackExc( tom stabel ved pop ); else {noe--; return elems[noe+1]; i-120 : 8/25/98 2. Abstraksjon i JAVA: 24

Unntakshåndtering dersom B kaller en metode E som kan kaste et unntak, må B ta eksplisitt stilling til hvordan unntaket skal håndteres metode B E() { kast u videre eller håndter her kaller metode E unntak u kastes vanlig retur public class BrukStab { Stack S = new Stab() ; public Object dos() throws EmptyStackExc { try { Object o = S.peek(); public Object remtop() { try { Object o = S.pop(); return o; catch (EmptyStackExc e) { return null; public class Stab IMPLEMENTS STACK { public Object peek() throws EmptyStackExc { if (empty()) throw new EmptyStackExc( tom stabel ); else return elems[noe]; public Object pop() throws EmptyStackExc { if (empty()) throw new StackEmptyExc( tom stabel ); else {noe--; return elems[noe+1]; public interface STACK { Object peek() throws EmptyStackExc; Object pop() throws EmptyStackExc; i-120 : 8/25/98 2. Abstraksjon i JAVA: 25 Unntaks-hierarki Unntak er objekter av klasser utledet fra klassen Throwable Et unntak som ikke catch es må deklareres i throw-klausul Throwable Error Exception AWTException IOException RuntimeException EOFException FileNotFoundException ArithmeticException IndexOutOfBoundsException Det er mest vanlig å definere nye unntak som extends Exception public class EmptyStackExc extends Exception { public EmptyStackExc() { super( Tom Stabel! ) ; public EmptyStackExc(String s) { super(s); i-120 : 8/25/98 2. Abstraksjon i JAVA: 26