Kap J 7-1 Mer om arv. (superklass) (subklass)



Relevanta dokument
Språkkonventioner och redigering av tal.

Objektorienterad programmering i Java

Konstruktion av klasser med klasser

Idag. Exempel, version 2. Exempel, version 3. Ett lite större exempel

OOP Objekt-orienterad programmering

Klasshierarkier - repetition

Föreläsning 4. ADT Kö Kö JCF Kö implementerad med en cirkulär array Kö implementerad med en länkad lista

Klasshierarkier. Klasser kan byggas på redan definierade klasser

OOP Objekt-orienterad programmering

TENTAMEN PROGRAMMERINGSMETODIK MOMENT 2 - JAVA, 4P

Outline. Objektorienterad Programmering (TDDC77) En frukt har ett namn. Man kan lägga en frukt i en korg... Hashing. Undantag. Ahmed Rezine.

Kungliga Tekniska Högskolan Ämneskod 2D4134 Nada Tentamensdag maj - 19 Tentamen i Objektorientering och Java Skrivtid 5 h

Programmering med Java. Grunderna. Programspråket Java. Programmering med Java. Källkodsexempel. Java API-exempel In- och utmatning.

TDA550 Objektorienterad programvaruutveckling IT, forts. kurs Övning vecka 2

Föreläsning 8: Exempel och problemlösning

Parsing med Recursive Descent, Avbildningsklasser. Syntaxdiagram. Syntaxdiagram och kodning expression. Betrakta följande uttryck

Objektorienterad Programmering (TDDC77)

Fördjupad Java. Undantagshantering. Fel

OOP Objekt-orienterad programmering

Att skriva till och läsa från terminalfönstret

TDDC30 Programmering i Java, Datastrukturer och Algoritmer Lektion 2. Laboration 2 Datastrukturer En liten uppgift Frågor

Föreläsning 10. ADT:er och datastrukturer

Repetition av OOP- och Javabegrepp

Föreläsning 9: Arv och UML

Tentamen. Programmeringsmetodik, KV: Java och OOP. 17 januari 2002

Föreläsning 2 Objektorienterad programmering DD1332. Typomvandling

Repetition av OOP- och Javabegrepp

Objektorienterad Programkonstruktion. Föreläsning 4 8 nov 2016

Objektorienterad programmering i Java Undantag Sven-Olof Nyström Uppsala Universitet Skansholm: Kapitel 11

2I1049 Föreläsning 5. Objektorientering. Objektorientering. Klasserna ordnas i en hierarki som motsvarar deras inbördes ordning

Föreläsning 4. ADT Kö Kö JCF Kö implementerad med en cirkulär array Kö implementerad med en länkad lista Läsanvisningar och uppgifter

TDDC30 Programmering i Java, Datastrukturer och Algoritmer Lektion 2. Länkade listor Stackar Köer MyList Iteratorer Lab 2 Exceptions Paket

Föreläsning 3: Abstrakta datastrukturer, kö, stack, lista

Lite om felhantering och Exceptions Mer om variabler och parametrar Fält (eng array) och klassen ArrayList.

Lösningsförslag till tentamen

Föreläsning 8. Arv. Arv (forts) Arv och abstrakta klasser

Kapitel 6. Hakparenteser fšr att ange index MŒnga všrden av samma typ

Lösningsförslag till omtentamen för TDA540 Objektorienterad Programmering

Föreläsning 3 Innehåll. Generiska klasser. Icke-generisk lista ArrayList, skiss av implementering. Icke-generisk lista Risk för fel

public och private Obs: private inte skyddar mot access från andra objekt i samma klass.

Grundkurs i programmering, 6 hp (725G61) Dugga 2 tillfälle 2

TDDE10 m.fl. Objektorienterad programmering i Java Föreläsning 6 Erik Nilsson, Institutionen för Datavetenskap, LiU

Arv: Fordonsexempel. Arv. Arv: fordonsexempel (forts) Arv: Ett exempel. En klassdefinition class A extends B {... }

Föreläsning 3. Stack

Lösningsförslag till tentamen i OOP, HI1027 Fredag 21 oktober 2011

Föreläsning 14. Filhantering

Classes och Interfaces, Objects och References, Initialization

Introduktion till arv

Föreläsning 13 Innehåll

Föreläsning 8 - del 2: Objektorienterad programmering - avancerat

Interface. Interface. Tobias Wrigstad (baserat på bilder från Tom Smedsaas) 3 december 2010

public interface Skrivbar { void skriv(); } public class Punkt implements Skrivbar { public double x; public double y;

Objektorienterad programmering i Java Undantag Sven-Olof Nyström Uppsala Universitet Skansholm: Kapitel 11

Idag. Javas datatyper, arrayer, referenssemantik. Arv, polymorfi, typregler, typkonvertering. Tänker inte säga nåt om det som är likadant som i C.

Objektorienterad Programmering DAT043. Föreläsning 4 23/1-18 Moa Johansson (delvis baserat på Fredrik Lindblads material)

Tentamen. 2D4135 vt 2005 Objektorienterad programmering, design och analys med Java Lördagen den 28 maj 2005 kl

Föreläsning REPETITION & EXTENTA

Klassen BST som definierar binära sökträd med tal som nycklar och enda data. Varje nyckel är unik dvs förekommer endast en

ADS : STACK ADT: STACK. Stack och Kö -Implementering - Tilllämpningar. Oftast förekommande metoder i Stack. TopOfStack

Exempel. Arrayer. Lösningen. Ett problem. Arrayer och hakparanteser. Arrayer

Föreläsning 5 (6) Metoder. Metoder Deklarera. Metoder. Parametrar Returvärden Överlagring Konstruktorer Statiska metoder tostring() metoden javadoc

List.java. List.java. Printed by Tom Smedsaas

TENTAMEN OOP

Tänk på följande: Det finns en referensbok (Java) hos tentavakten som du får gå fram och läsa men inte ta tillbaka till bänken.

DI-institutionen Sid 1 av 6 Hans-Edy Mårtensson Sten Sundin

Ett problem. Kontrollstrukturer och arrayer. Arrayer. Lösningen. Arrayer och hakparanteser. Exempel int[] results; results = new int[10]; // 0..

Tentamen Programmeringsteknik II och NV2 (alla varianter) Skriv bara på framsidan av varje papper.

Länkade strukturer. (del 2)

TDDE10 m.fl. Objektorienterad programmering i Java Föreläsning 6 Erik Nilsson, Institutionen för Datavetenskap, LiU

LÖSNINGSFÖRSLAG Programmeringsteknik För Ing. - Java, 5p

UML. Klassdiagr. Abstraktion. Relationer. Överskugg. Överlagr. Aktivitetsdiagram Typomv. Typomv. Klassdiagr. Abstraktion. Relationer.

Tentamen LÖSNINGSFÖRSLAG. c) Tilldelningen C x = new D() ger kompileringsfel eftersom klassen D är abstrakt.

F12 - Collections. ID1004 Objektorienterad programmering Fredrik Kilander

TDDC30. Objektorienterad programmering i Java, datastrukturer och algoritmer. Föreläsning 2 Jonas Lindgren, Institutionen för Datavetenskap, LiU

Objektorienterad programmering D2

Övning vecka 6. public void method2() { //code block C method3(); //code block D }//method2

Inkapsling tumregler. Åtkomstmodifikatorer, instantiering, referenser, identitet och ekvivalens, samt klassvariabler. public och private

LÖSNINGSFÖRSLAG TILL TENTAMEN PROGRAMMERINGSMETODIK MOM2 - JAVA, 4P.

Lösningsförslag till tentamen för TDA540 Objektorienterad Programmering

Länkade strukturer, parametriserade typer och undantag

EDAA20 Föreläsning Klassen ArrayList. Viktiga operationer på ArrayList. Generisk klass

DD2310. Javaprogrammering för Pythonprogrammerare. Johan Boye

Tentamen i Algoritmer & Datastrukturer i Java

TDDD78 Viktiga begrepp, del 2

Exempel på användning av arv: Geometriska figurer

TDDC30. Objektorienterad programmering i Java, datastrukturer och algoritmer. Föreläsning 4 Erik Nilsson, Institutionen för Datavetenskap, LiU

Exempel på listor (klassen ArrayList). Ett exempel med fält. Avbildning är en speciell typ av lista HashMap.

Föreläsnings 9 - Exceptions, I/O

Kompilering och exekvering. Föreläsning 1 Objektorienterad programmering DD1332. En kompilerbar och körbar java-kod. Kompilering och exekvering

LULEÅ TEKNISKA UNIVERSITET

Arrayer. results

Fakulteten för ekonomi, kommunikation och IT. Corba. Datum: Mathias Andersson

Programmering för språkteknologer II, HT2014. Rum

Föreläsning 3. Stack

Målen med OOSU. Objektorienterad programmering. Objektorienterad programmering. Karlstads Universitet, Johan Öfverberg 1

Objektsamlingar i Java

Objektorienterad Programkonstruktion. Föreläsning 2 2 nov 2016

Abstrakt datatyp. -Algoritmer och Datastrukturer- För utveckling av verksamhet, produkter och livskvalitet.

Instuderingsuppgifter läsvecka 6 - LÖSNINGAR

Recitation 4. 2-D arrays. Exceptions

Transkript:

Mer om arv. Kap J7-1 I Java självt är arv frekvent förekommande. Två exempel är exceptions och components (awt). Arv bygger normalt på en IS-A-relation. Button IS-A Component. NullPointerException IS-A RuntimeException. Polymorfism och dynamisk bindning. Återanvändning av kod. ArrayIndexOutOfBoundsException RuntimeException IndexOutOfBoundsException StringIndexOutOfBoundsException Exception NullPointerException IOException (superklass) EOFException FileNotFoundException (subklass) Klassen Shape Kap J7-2 public abstract class Shape private String name ; abstract public double area( ); public Shape( String shapename ) name = shapename ; final public boolean lessthan( Shape rhs) return area( ) < rhs.area( ); final public String tostring( ) return name + " of area " + area( ); Kap J7-3 Klasserna Circle Rectangle och Square. public class Circle extends Shape private double radius ; private static final double PI=3.141592; public Circle (double rad) super( circle " ); radius = rad; public double area( ) return PI * radius * radius ; public class Rectangle extends Shape private double length; private double width; public Rectangle (double len, double wid) super( "rectangle " ); length = len; width = wid; public double area( ) return length * width; public class Square extends Rectangle public Square(double side) super(side, side); 1

Referenser till subklasser. Kap J7-4 Regel: Om värde av typen ref till basklass krävs, kan man ge uttryck av typen ref till subklass. Regel: En referensvariabel som har typen referens till basklass får referera även till objekt som är av subklasstyp. Rectangle rec= new Rectangle (1,2); Square sq= new Square(3); Shape sh; sh=rec; sh=sq; rec =sq;// alla är ok! sq=rec // ej tillåtet sq= (Square) rec; //ok med explicit typomvandling if (rec instanceof Square) //Bättre! sq= (Square) rec; Typer av metoder i en klass. Kap J7-5 Fyra typer av metoder Final metoder Används när metoden är oföränderlig (invariant) över klasshierkin. Statisk bindning. Abstrakta metoder superklassen har ingen implementation och är abstrakt. Medför att subklasser måste implementera den eller själva bli abstrakta. Dynamisk bindning. Statiska metoder inget kontrollerande objekt. Statisk bindning. Övriga metoder superklassen ger en defaultimplemetation som av subklasserna antingen överskuggas eller accepteras som den är. Dynamisk bindning. Sortering av figurer (Shapes). Kap J7-6 Problemformulering: Läs N st figurer (cirklar, rektanglar, kvadrater) och skriv ut dem sorterade efter area. I följande program finns exempel på Polymorfism och dynamisk bindning. Konstruktorer vid arv. 2

Klassen TestShape Kap J7-7 import java.io.*; class TestShape private static BufferedReader in; private static void insertionsort(shape [ ] a ) for( int p = 1; p < a.length; p++ ) int j = p; Shape tmp = a[ p ]; for(;j> && tmp. lessthan(a[j-1]); j-- ) a[ j ] = a[ j - 1 ]; a[ j ] = tmp; Klassen TestShape, forts. Kap J7-8 public static void main(string[] args) try // Get # of shapes System.out.println( "Enter #of shapes"); in=new BufferedReader( new InputStreamReader(System.in)); int numshapes= Integer.parseInt(in.readLine() ); // Read the shapes Shape[] array=new Shape[numShapes]; for( int i = ; i < numshapes; i++ ) array[ i ] = readshape( ); insertionsort( array ); //Sort and output System.out.println( " Sorted by area:" ); for( int i = ; i < numshapes; i++ ) System. out.println( array[ i ] ); catch(exception e) System.out.println( e ); Klassen TestShape, forts. Kap J7-9 private static Shape readshape( ) double rad, len, wid; String oneline; try System.out.println( "Enter shape type:" ); do oneline = in.readline( ); while ( oneline. length( ) == ); switch( oneline.charat( ) ) case 'c': System.out.println( " Enter radius:"); rad = Double.valueOf( in.readline()).doublevalue(); return new Circle (rad ); case 's': System.out.println( " Enter side: " ); len= Double.valueOf(in.readLine()).doubleValue(); return new Square(len); case 'r': System.out.println("Enter length and width + "on separate lines: "); len = Double.valueOf( in.readline( ) ).doublevalue( ); wid=double.valueof(in.readline()).doublevalue(); return new Rectangle (len,wid); default : System.err.println( "Need c, r, or s" ); return new Circle ( ); catch( IOException e ) System.err.println( e ); return new Circle ( ); 3

En körning Kap J7-1 D:\minaprog>java TestShape Enter #of shapes 4 Enter shape type: r Enter length and width on separate lines : 4 5 Enter shape type: r Enter length and width on separate lines : 3 6 Enter shape type: s Enter side: 5 Enter shape type: c Enter radius: 2.5 Sorted by area: rectangle of area 18. circleof area 19.63495484375 rectangle of area 2. rectangle of area 25. D:\minaprog> Varför super final? Kap J7-11 Det reserverade ordet super används för att anropa överskuggade metoder. komma åt dolda instansvariabler. anropa superklassens konstruktor. Obs! Måste ligga som första sats i subklassens konstruktor! Det reserverade ordet final anger att en metod inte får överskuggas. gäller även private- och static-deklarerade metoder. en klass är slutgiltig, d v s får inte ärvas. Metoden finalize är definierad i Object-klassen. anropas automatiskt precis innan ett objekt utsätts för g.c. används för att låta objektet städa upp efter sig, släppa systemresurser etc. T ex public void finalize () throws Throwable infil.close (); super. finalize (); //sker ej med automatik En egendefinierad kö. Kap J7-12 // Queue class // // Konstruerad utan initierare // // ******************Publika operationer********************* // void enqueue( x ) --> Sätt in x // Object getfront( ) --> Returnera äldsta elementet // Object dequeue( ) --> Returnera och ta bort äldsta elementet // boolean isempty( ) --> Returnera true if tom; annars false // void makeempty( ) --> ta bort alla elementet // ******************Fel***************************************** // getfront eller dequeue på en tom kö * List-baserad implementation av kö. public class Queue private ListNode front; private ListNode back; 4

Kö forts. Kap J7-13 * Konstruera kön. public Queue( ) front= back=null; * Testa om kön är tom (logiskt sett). * @returnera true om tom, annars false. public boolean isempty( ) return front == null; * Gör att kön är tom (logiskt sett). public void makeempty( ) front = null; back = null; Kö forts. Kap J7-14 * Returnera äldsta elementet i kön. * Ändrar ej kön. * @ return the least recently inserted itemin the queue. * @ exception Underflowom kön är tom. public Object getfront( ) throws Underflow if ( isempty()) throw new Underflow( "Queue getfront" ); return front.element; * Returnera och ta bort äldsta elementet i kön. * @Returnera och ta bort äldsta elementet i kön. * @ exception Underflowom kön är tom. public Object dequeue( ) throws Underflow if ( isempty( ) ) throw new Underflow( "Queue dequeue" ); Object returnvalue = front.element; front = front.next; return returnvalue; Kö forts. Kap J7-15 * Sätt in ett nytt element i kön. * @ paramx är det nya elementsom sätts in. public void enqueue( Object x ) if ( isempty( ) ) // Make queue of one element back = front = new ListNode( x ); else // Regular case back = back.next = new ListNode( x ); 5

Klass ListNode Kap J7-16 // Bas-nod lagrad i en länkad lista. // Är tänkt att inte vara nåbar utanför // det aktuella paketet class ListNode // "Friendly data"; accessbara av // rutiner i samma paket Object element; ListNode next; // Konstruktorer ListNode( Object theelement ) this( theelement, null ); ListNode(Object theelement,listnode n) element = theelement; next = n; Exceptionklassen Kap J7-17 Underflow * Exception class for access in empty * containers such as stacks, queues, * and priority queues. public class Underflow extends Exception * Construct this exception object. * @param message the error message. public Underflow( String message ) super( message ); Klassen QueueTest Kap J7-18 import java.util.*; class QueueTest publicstatic void main(string[] args) throws Underflow Queue q = new Queue(); q.enqueue(new Circle(12)); q.enqueue(new Square(12)); Object o = q.dequeue( ); System.out.println(o + " blir servad"); q.enqueue(new Square(2)); q.enqueue(new Rectangle(1,2)); o = q.dequeue( ); System.out.println(o + " blir servad"); q.enqueue(new Circle(2)); System.out.println("Först i kön står nu + q.getfront()); while (!q.isempty()) o = q.dequeue( ); System.out.println(o + " blir servad"); //nu blir det underflow!!!!! o = q.dequeue( ); 6

Exekvering Kap J7-19 D:\minaprog\java\ohtester\Shape>java QueueTest circle of area 452.3892487 blir servad rectangle of area 144. blir servad F rst i k n st_r nu rectangle of area 4. rectangle of area 4. blir servad rectangle of area 2. blir servad circle of area 12.566368 blir servad Exception in thread "main" Underflow: Queue dequeue at Queue.dequeue(Queue.java:7) at QueueTest.main(Compiled Code) D:\minaprog\java\ohtester\Shape> Kap J7-2 Objektsamlingar och klassen Vector. Några Vector-metoder void addelement(object x) Add x to the end of the list/vector. void insertelementat (Object x, intindex) Insertx at the given index. void setelementat (Object x, int index) Replace the objectat index with x. Note: The given index must currently be in the list/vector.) void removeelementat(int index) Removethe indicated element. void removeallelements() Make the list empty. Object elementat (int index) Return the element at index. Klassen Vector, forts. Kap J7-21 Ytterligare Vector-metoder int size() Return the number of elements currently in the vector. boolean isempty() Return whether the vector is empty. Vector(int initialcapacity, int incr) Construct a vector with the indicated initial capacity and add space for incr elements each time the vector is expanded. Vector(int initialcapacity) Construct a vector with the indicated initial capacity and double the capacity each time the vector is expanded. Vector() Same as Vector(1). 7

Vector-exempel Kap J7-22 Vector v = new Vector(); v.addelement("string2"); v. addelement("string 4"); v.insertelementat("string 1", ); v.insertelementat("string 3", 2); v.addelement("string 5"); for (int i=; i<v.size(); i++) String s = (String ) v. elementat(i); System. out.println (s); while (!v.isempty()) String s = (String) v.lastelement(); v.removeelementat(v.size()-1); System. out.println(s); Vector som kö. Kap J7-23 import java.util.*; class QTest public static void main(string[] args) Vector q = new Vector(); q.addelement(new Circle(12)); q.addelement(new Square(12)); q.addelement(new Square(2)); q.addelement(new Rectangle(1,2)); q.addelement(new Circle(2)); for (int i=; i<q.size(); i++) Object o = q.elementat(i); System.out.println(o); while (!q.isempty()) System.out.println( ((Shape)q.firstElement()).area() ); q.removeelementat(); Exekvering Kap J7-24 C:\phe\java>javac QTest.java C:\phe\java>java QTest circle of area 452.3892487 rectangle of area 144. rectangle of area 4. rectangle of area 2. circle of area 12.566368 452.3892487 144. 4. 2. 12.566368 C:\phe\java> 8

Iteratorer Kap J7-25 Generell teknik som kan användas för alla datasamlingar. I Java 1.1 används standardklassen java.util.enumeration för att beskriva iteratorer. Metoden elements() används för att skapa en iterator för att löpa igenom vektorn. Klassen Enumeration har bara två metoder: hasmoreelements() som returnerar true om det finns komponenter kvar i vektorn (datasamlingen). nextelement () returnerar nästa komponent i datasamlingen (typ: Object). Användning av iterator. Kap J7-26 import java.util.*; class QTestE public static void main(string[] args) Vector q = new Vector(); q.addelement(new Circle(12)); q.addelement(new Square(12)); q.addelement(new Square(2)); q.addelement(new Rectangle(1,2)); q.addelement(new Circle(2)); for (Enumeration e=q.elements();e.hasmoreelements();) Object o = e.nextelement(); if (o instanceof Rectangle) System.out.println(o); while (!q.isempty()) System.out.println( ((Shape)q.firstElement()).area() ); q.removeelementat(); Exekvering Kap J7-27 C:\phe\java>javac QTestE.java C:\phe\java>java QTestE rectangle of area 144. rectangle of area 4. rectangle of area 2. 452.3892487 144. 4. 2. 12.566368 C:\phe\java> 9