Objektorienterad programmering (OOP) Föreläsning 15 & 16. Klasser för olika slags fordon. Klasser och objekt

Relevanta dokument
Föreläsning 13 Innehåll

Föreläsning Innehåll. Checklista. Några metoder i klassen ArrayList<E> Exempel på vad du ska kunna

Föreläsning Innehåll. Generisk klass. Några metoder i klassen ArrayList<E>

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

Föreläsning 5-6 Innehåll. Exempel på program med objekt. Exempel: kvadratobjekt. Objekt. Skapa och använda objekt Skriva egna klasser

Föreläsning 5-6 Innehåll

Föreläsning 9-10 Innehåll

Konstruktion av klasser med klasser

Repetition av viktiga begrepp inom objektorienterad programmering

1 Repetition av viktiga begrepp inom objektorienterad programmering

EDAA20 Programmering och databaser. Mål komprimerat se kursplanen för detaljer. Om att lära sig programmera. Föreläsning 1-2 Innehåll.

Objekt-orientering. Java är ett objekt-orienterat programmeringsspråk

OOP Objekt-orienterad programmering

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

Saker du ska kunna Föreläsning 13 & 14

F8 - Arv. ID1004 Objektorienterad programmering Fredrik Kilander

Att deklarera och att använda variabler. Föreläsning 10. Synlighetsregler (2) Synlighetsregler (1)

EDAA20 Programmering och databaser. Mål komprimerat se kursplanen för detaljer. Checklista. Föreläsning 1-2 Innehåll. Programmering.

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

Klasshierarkier. Klasser kan byggas på redan definierade klasser

TDDE10 TDDE11, 725G90. Objektorienterad programmering i Java, Föreläsning 3 Erik Nilsson, Institutionen för Datavetenskap, LiU

Klasshierarkier - repetition

Exempel på användning av arv: Geometriska figurer

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

"Är en"-relation. "Har en"-relation. Arv. Seminarium 2 Relevanta uppgifter. I exemplet Boll från förra föreläsningen gällde

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

OOP Objekt-orienterad programmering

Föreläsning REPETITION & EXTENTA

TDDD78 Viktiga begrepp, del 2

Objektorientering. Objekt och metoder. Objektorientering. Viktiga begrepp. Klass. Objekt. Deklarativ programmering

TENTAMEN OOP

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

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

Föreläsning Innehåll. Hantera många element. Exempel: polygon Godtyckligt antal element. Exempel: polygon forts

Objekt som argument. Föreläsning 7-8 Innehåll. Hur komma åt den andra kvadratens attribut? Anropa metod på objektet självt

Grundläggande programmering, STS 1, VT Sven Sandberg. Föreläsning 14

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

Subklasser och arv Inledning till grafik (JFrame och JPanel). Något om interface. Objektorienterad programvaruutveckling GU (DIT011) Subklasser

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

Föreläsning 7-8 Innehåll

Mål Förklaring av termer

Föreläsning 3-4 Innehåll

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

Mål Förklaring av termer

DAT043 Objektorienterad programmering för D, DIT011 Objektorienterad programvaruutveckling för GU

Föreläsning 5&6 LOGISKA VARIABLER; IMPLEMENTERA KLASSER; MER ALGORITMER

Innehåll. dynamisk bindning. och programmering CRC) u Arv, polymorfi och

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

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

Programmering i C++ EDA623 Arv. EDA623 (Föreläsning 6) HT / 42

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

Föreläsning 8 SLUMPTAL, SIMULERING + INTRODUKTION TILL VEKTORER

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

TENTAMEN OOP

Exempel på program med objekt Klass med main-metod. Föreläsning 3-4 Innehåll. Övning Viktiga begrepp

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

Omtentamen för TDA540 Objektorienterad Programmering. Institutionen för Datavetenskap CTH HT-17, TDA540. Dag: , Tid:

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

Laboration 1 - Grunderna för OOP i Java

Outline. Objektorienterad Programmering (TDDC77) Signatur. Klassen calculator. Överlagring (overloading) Arv (inheritance) Ahmed Rezine

Dagens program. Programmeringsteknik och Matlab. Objektorienterad programmering. Vad är vitsen med att ha både metoder och data i objekten?

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

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

TENTAMEN OOP

Objektorienterad Programmering (TDDC77)

Del A (obligatorisk för alla)

Objektorienterad programmering Föreläsning 12. Copyright Mahmud Al Hakim

Classes och Interfaces, Objects och References, Initialization

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

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

Laboration 1: Figurer i hierarki

UML. Objekt-orienterad programmering och design (DIT952) Niklas Broberg, 2016

1 Uppgift 1. a) Skapar ett Company-objekt med hjälp av den överlagrade konstruktorn. Du kan själv välja värden på instansvariablerna.

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

Objektorienterad programmering i Java

Arv. Fundamental objekt-orienterad teknik. arv i Java modifieraren protected Lägga till och modifiera metoder med hjälp av arv Klass hierarkier

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

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

Kopiering av objekt i Java

Static vs Dynamic binding Override vs Overload. Objekt-orienterad programmering och design Alex Gerdes och Sólrún Halla Einarsdóttir, 2018

Del A (obligatorisk för alla)

Övning 4. I denna övning ska vi titta på icke-muterbarhet kontra muterbarhet, samt metoderna equals, hashcode och clone.

Föreläsning 10 OM DELMÅLSKONTROLLEN ; VARIABLERS SYNLIGHET STRING OCH STRINGBUILDER

Java-syntax (arv) Exempel: public class Crow extends Bird {... } Jämför med Lab 1: public class FirstApp extends Frame {... }

Abstrakt klass. DD2385 Programutvecklingsteknik Några bilder till föreläsning 4 31/ Exempel: Implementation av Schackpjäser.

Föreläsning 3-4 Innehåll. Diskutera. Metod. Programexempel med metod

Föreläsning 4. Klass. Klassdeklaration. Klasser Och Objekt

Instuderingsuppgifter läsvecka 2

Outline. Objektorienterad Programmering (TDDC77) Åsidosättning. Signatur. Åsidosättning. Abstrakta klasser. Ahmed Rezine.

Innehåll. 1 Kort om dynamisk polymorfism. 2 Arv i C++ 3 Multipelt arv. 4 Något om statisk polymorfism. class Container {

Arv (Inheritance) Multipelt arv finns i verkligheten. Överskuggning, metodbindning. Läsanvisning: ! Arv! Object, instanceof! Relationer!

1 Egna klasser. 1.1 En punkt-klass

OOP Objekt-orienterad programmering

EDAA30 Programmering i Java - fortsättningskurs

Föreläsnings 10 - Överlagring, Konstruerare, Arv, Mer Exceptions, Reguljära Uttryck

Uppgiften är att beskriva en kvadrat i ett Java program. En första version av programmet skulle kunna se ut så här:

OOP Objekt-orienterad programmering

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

Tentamen i Objektorienterad modellering och design Helsingborg

Outline. Objektorienterad Programmering (TDDC77) Att instansiera en klass. Objekt. Instansiering. Åtkomst. Abstrakt datatyp.

Transkript:

Föreläsning 15 & 16 ARV Objektorienterad programmering (OOP) Idé: vi ser ett program som en modell av verkligheten Ursprung: Simula-67, Norsk regnesentral, 1960-talet Smalltalk-80: Xerox PARC, 1970-talet C++: AT&T, 1980-talet Java, Sun Microsystems, 1995 Scala, Ruby, C#, Python,... OOP framgångsrikt för utveckling av stora program Klasser och objekt Objekt beskriver saker från verkligheten Ex. en tärning, en kvadrat,... Klasser beskriver det som är gemensamt för objekten Alla tärningar kan kastas (har exempelvis en roll-metod) Alla kvadrater har en sida (har exempelvis ett side-attribut) Klasser för olika slags fordon Antag att vi i ett program hanterar olika slags fordon: public class Car { private String licensenbr; private Person owner; private int maxpassengers;... public class Truck { private String licensenbr; private Person owner; private int maxload;... public class Bus { private String licensenbr; private Person owner; private int maxpassengers;... public class MotorCycle { private String licensenbr; private Person owner;... Konstruktion av större program innefattar modellering

Problem Lösning De olika slagen fordon har olika egenskaper och beskrivs i var sin klass: Car, Truck, Bus och MotorCycle. Antag att vi vill simulera en kö framför ett trafikljus. Kön representeras av en lista eller en vektor med fordon. Hur ska vi deklarera en sådan lista eller vektor? Vilken typ har elementen? Vi behöver en klass som beskriver fordon: Vehicle Då kan vi deklarera listor och skapa listor respektive vektorer som kan innehålla fordon: ArrayList<Vehicle> list = new ArrayList<Vehicle>(); Vehicle[] v = new Vehicle[100]; Men får vi sätta in t.ex. Car-objekt i list eller v? Ja, om Car ärver från klassen Vehicle: public class Car extends Vehicle { Fordon igen, nu med arv Arv: exempel på klassdiagram public class Vehicle { private String licensenbr; private Person owner; public class Car extends Vehicle { private int maxpassengers; public class Truck extends Vehicle { private int maxload;... public class Bus extends Vehicle { private int maxpassengers; public class MotorCycle extends Vehicle { superklass: gemensamma egenskaper Car int maxpassengers Bus int maxpassengers Vehicle String licensenbr Person owner MotorCycle Truck int maxload subklasser: specifika egenskaper för bilar, bussar, motorcyklar, lastbilar Denna notation är en del av UML (Unified Modeling Language)

Regler för referensvariabler Abstrakta klasser En referensvariabel som deklarerats med typen C får referera till objekt av klassen C och dessutom till objekt av alla subklasser till C. Exempel: En variabel med typen Vehicle får referera till objekt av alla subklasser till Vehicle. Vehicle avehicle; avehicle = new Car("ABC123", p1, 5); avehicle = new Bus("DEF789", p2, 56); I program som använder våra fordonsklasser kommer vi inte att skapa objekt av klassen Vehicle, utan bara av klasserna Car, Truck, Bus och MotorCycle. I verkligheten finns ju bilar, bussar, lastbilar och motorcyklar, men på vägarna kör det ju inte omkring någonting som bara är ett fordon. Klasser man inte skapar objekt av kallas abstrakta klasser. public abstract class Vehicle {... Superklass Subklasser Klassen Vehicle innehåller attribut och metoder som är gemensamma för alla fordon. På så sätt slipper vi duplicerad information. Klasserna Car, Truck, Bus och MotorCycle ärver dessa attribut och metoder från klassen Vehicle. Vehicle är exempel på en superklass. Sådana är ofta också abstrakta klasser. public abstract class Vehicle { private String licensenbr; private Person owner; Kvar i respektive subklass är de attribut och metoder som är specifika för just detta slags fordon. public class Car extends Vehicle { private int maxpassengers;... public class Truck extends Vehicle { private int maxload;... public class Bus extends Vehicle { private int maxpassengers;...

Objekt innehåller ärvda attribut Arv: klassdiagram Person p = new Person( Ragnar Vanheden ); Car c = new Car( ABC123, p, 5); Vehicle String licensenbr Person owner c attribut deklarerade i superklassen Vehicle attribut deklarerade i subklassen Car licensenbr ABC123 owner maxpassengers 5 Car int maxpassengers Bus int maxpassengers MotorCycle Truck int maxload Ragnar Vanheden Klassdiagram för alternativ design (med PassengerVehicle) Alternativ design: ännu mer arv PassengerVehicle int maxpassengers Vehicle String licensenbr Person owner MotorCycle Truck int maxload public class PassengerVehicle extends Vehicle { private int maxpassengers; public class Car extends PassengerVehicle { public class Bus extends PassengerVehicle { Car Bus

Objekt innehåller ärvda attribut (fallet med PassengerVehicle) Konstruktorer och arv Person p = new Person( Ragnar Vanheden ); Car c = new Car( ABC123, p, 5); Konstruktorn i Vehicle ser ut som vanligt. c attribut deklarerade i superklassen Vehicle deklarerade i superklassen PassengerVehicle licensenbr ABC123 owner maxpassengers 5 Ragnar Vanheden public abstract class Vehicle { private String licensenbr; // registreringsnummer private Person owner; // ägare /** Initierar ett Vehicle-objekt med registreringsnumret licensenbr och ägaren owner. */ protected Vehicle(String licensenbr, Person owner) { this.licensenbr = licensenbr; this.owner = owner; Konstruktorer i subklasser När ska man använda arv? Konstruktorn i subklassen Truck måste först anropa superklassens konstruktor med super(...): public class Truck extends Vehicle { private int maxload; // maxlast /** Skapar ett Truck-objekt med registreringsnumret licensenbr, ägaren owner och maxlasten maxload. */ public Truck(String licensenbr, Person owner, int maxload) { super(licensenbr, owner); this.maxload = maxload; På så sätt får de ärvda attributen sina startvärden. Ska klassen Point vara superklass till klassen Square så att klassen Square kan ärva attributen x, y och metoden move? public class Point { private int x, y; // punktens koordinater public Point(int x, int y) { this.x = x; this.y = y; public void move(int dx, int dy) { x = x + dx; y = y + dy; Nej! En kvadrat är inte en slags punkt.

När ska man använda arv? När ska man använda arv? Subklasserna ska vara specialiseringar av superklassen, och kvadrater och cirklar är inte ett speciellt slags punkter. I stället använder vi sammansättning, som tidigare: public class Square { private Point location; private int side; public class Circle { private Point location; private int radius; Arv passar bra när man har en "är-en"-relation mellan klasser. En bil är ett slags fordon. En lastbil är ett slags fordon. En buss är ett slags fordon. Är-en och har-en Figurer med arv superklass En kvadrat har-ett läge som beskrivs av en punkt, men är ingen punkt. Alltså: sammansättning. En kvadrat är-en geometrisk figur. Alltså: arv. En lastbil är-ett fordon. En lastbil har-en motor. En hund är-ett däggdjur. En hund har-en ägare (en människa). En människa är-ett däggdjur. En människa har-en hund. public abstract class Shape { protected Point location; /** Skapa en figur med givna koordinater */ protected Shape(int x, int y) { location = new Point(x, y); /** Flytta figuren */ public void move(int dx, int dy) { location.move(dx, dy);

public, private eller protected? I klassen måste man tala om vilka attribut och metoder som ska vara åtkomliga utanför klassen. public åtkomlig utanför klassen private endast åtkomlig inuti i klassen protected åtkomlig i klassen och i dess subklasser Skydd i samband med arv public class A { private int x; protected int y; public int z; // publikt attribut: sällan en bra idé public class B extends A { // här är de ärvda attributen y och z tillgängliga, // x är inte tillgängligt Ofta är attribut och konstruktorer i superklasser deklarerade protected. Exempel på arv: geometriska figurer I ett program ska geometriska figurer (kvadrater och cirklar) hanteras. Figurerna ska kunna flyttas och ritas upp på skärmen. Shape Figurer, superklassen Shape public abstract class Shape { protected Point location; protected Shape(int x, int y) { location = new Point(x, y); public void move(int dx, int dy) { location.move(dx, dy); // figurens läge Square Circle

Figurer, subklasser public class Square extends Shape { private int side; // kvadratens sidlängd public Square(int x, int y, int side) { super(x, y); this.side = side; public class Circle extends Shape { private int radius; // cirkelns radie public Circle(int x, int y, int radius) { super(x, y); this.radius = radius; Flytta figurerna Antag att det i en vektor shapes finns 100 figurer lagrade. Flytta alla figurerna 10 pixlar i x-led och 20 pixels i y-led. Shape[] shapes = new Shape[100];... // 100 figurer av olika slag läggs in i vektorn for (int i = 0; i < shapes.length; i++) { shapes[i].move(10, 20); Alla figurer flyttas på samma sätt. Metoden move implementeras därför med fördel i superklassen Shape. Subklassen Square public class Square extends Shape { private int side; // kvadratens sidlängd public Square(int x, int y, int side) { super(x, y); this.side = side; public int getside(){ return side; public void draw(simplewindow w){ int x = location.getx(); int y = location.gety(); w.moveto(x, y); w.lineto(x + side, y); w.lineto(x + side, y + side); w.lineto(x, y + side); w.lineto(x, y); Subklassen Circle public class Circle extends Shape { private int radius; // cirkelns radie public Circle(int x, int y, int radius) { super(x, y); this.radius = radius; public int getradius(){ return radius; public void draw(simplewindow w){ int x = location.getx(); int y = location.gety(); w.moveto(x + radius, y); for (int i = 1; i <= 180; i++) { w.lineto(x + (int)(radius * Math.cos(2*i*Math.PI/180)), y + (int)(radius * Math.sin(2*i*Math.PI/180)));

Rita figurerna Problem med metoden draw Antag att det i en vektor shapes finns 100 figurer lagrade. Rita alla figurerna. Shape[] shapes = new Shape[100];... // 100 figurer av olika slag läggs in i vektorn for (int i = 0; i < shapes.length; i++) { shapes[i].draw(w); Kvadrater och cirklar ritas på olika sätt. Metoden draw måste därför implementeras i subklasserna Square respektive Circle. Så här kan vi göra: Square mysquare = new Square(100, 100, 50); mysquare.draw(); Men inte så här: Shape myshape = new Square(100, 100, 50); myshape.draw(); Eftersom myshape är deklarerad med typen Shape så söker kompilatorn efter draw i klassen Shape och därefter uppåt i arvshierarkin. Men metoden draw finns ju inte där! Istället är draw implementerad i subklasserna Square och Circle. Rita figurerna Dynamisk bindning polymorfism Då fungerar ju inte heller detta: Shape[] shapes = new Shape[100];... // 100 figurer av olika slag läggs in i vektorn for (int i = 0; i < shapes.length; i++) { shapes[i].draw(w); The method draw() is undefined for the type Shape Man kan skriva en tom draw-metod i Shape: public abstract class Shape { public void draw(simplewindow w) { Det fungerar eftersom Java använder dynamisk bindning av metodanrop. Det innebär att det är objektets typ som under exekvering avgör vilken metod som ska anropas. När satsen shapes[i].draw(w) ska utföras så tittar Javasystemet alltså på objektet shapes[i]: om det är ett Square-objekt så anropas draw i Square, om det är ett Circle-objekt så anropas draw i Circle.

Abstrakta metoder Sammanfattning Det är bättre att specificera draw-metoden som abstrakt i Shape. Man talar då om att implementeringarna av operationen finns i subklasserna: public abstract class Shape {... /** Ritar figuren i fönstret w */ public abstract void draw(simplewindow w); När man skapar en subklass till Shape kommer kompilatorn då att kräva att subklassen har en draw-metod. Att kunna flyttas är en egenskap hos alla figurer. Alla figurer flyttas på samma sätt och därför placerar man moveoperationen i klassen Shape. Operationen ärvs av subklasserna Square och Circle. Att kunna ritas upp är också en egenskap hos alla figurer. Eftersom olika figurer ritas på olika sätt specificerar man drawoperationen som abstrakt i klassen Shape. En implementering av operationen finns i varje subklass till Shape. Att ha en sidlängd och att ha en radie är egenskaper som är specifika för klassen Square respektive Circle. Implementeringarna av de metoder som hanterar motsvarande attribut är också specifika för respektive subklass. Fördelar med arv this och super Gör det lättare att skapa modeller som beskriver det verkliga systemet väl. Gemensamma attribut och operationer behöver bara skrivas en gång i superklassen. Vi kan deklarera referensvariabler som får referera till objekt av alla de olika subklasserna. Exempel: ArrayList<Vehicle> list = new ArrayList<Vehicle>(); list.add(new Car("ABC123", p1, 5)); list.add(new Bus("DEF789", p2, 56)); this: referens till det aktuella objektet. super: referens till det aktuella objektet men har superklassens typ. public abstract class Shape { protected Point location; protected void print() { System.out.print("Läge: " + location.getx() + "," + location.gety()); public class Square extends Shape { private int side; public void print() { System.out.print("Detta är en kvadrat. "); super.print(); // skriv ut läget System.out.print(", sidlängd: " + side);

Rekursiva metoder instanceof Definition av fakultet: n! = 1 n = 0 = n *(n-1)! n > 0 public static int factorial(int n) { if (n <= 0) { return 1; else { return n * factorial(n - 1); Ni kan läsa mer om rekursiva metoder i fortsättningskurserna... Räkna figurer av olika slag: Shape[] shapes = new Shape[100]; int nbrsquares = 0; int nbrcircles = 0; for (int i = 0; i < shapes.length; i++) { Shape ashape = shapes[i]; if (ashape instanceof Square) { nbrsquares++; else if (ashape instanceof Circle) { nbrcircles++; System.out.println("Antalet kvadrater: " + nbrsquares); System.out.println("Antalet cirklar: " + nbrcircles); Typkonvertering av referenser Anta att vi vill ha reda på den största cirkelradien i vår vektor av figurer. Då fungerar detta inte: Shape[] shapes = new Shape[100]; int maxradius = 0; for (int i = 0; i < shapes.length; i++) { Shape ashape = shapes[i]; if (ashape instanceof Circle) { int r = ashape.getradius(); // kompileringsfel: if (r > maxradius) { // Shape har ingen maxradius = r; // getradius-metod System.out.println( Störst radie: " + maxradius); Typkonvertering av referenser Vi måste uttryckligen konvertera typen till Circle: Shape[] shapes = new Shape[100]; int maxradius = 0; for (int i = 0; i < shapes.length; i++) { Shape ashape = shapes[i]; if (ashape instanceof Circle) { Circle c = (Circle) ashape; int r = c.getradius(); if (r > maxradius) { maxradius = r; System.out.println( Störst radie: " + maxradius);

Typkonvertering av referenser Typkonverteringar av detta slag används då programmeraren vet att det refererade objektet är av en specifik typ. Om så inte är fallet (programmeraren hade fel) avbryts programmet med ett felmeddelande. Man kan bara konvertera en referens till en subklass av referensens typ. Följande fungerar naturligtvis inte: Shape shape = MotorCycle mc = (MotorCycle) ashape; Typregler, igen Shape ashape; Square asquare; Garanterat korrekt: asquare = new Square(...); ashape = new Square(...); ashape = asquare; Säkert fel (ger kompileringsfel): asquare = new Circle(...); asquare = ashape; // samma typ // Square är subklass // till Shape // också korrekt, av // samma orsak // inte samma typ och // Circle är inte subklass // till Square // Shape är inte subklass // till Square Följande beror på vilken slags objekt ashape faktiskt refererar till: asquare = (Square) ashape; // ger ett exekveringsfel om ashape // inte refererar till en kvadrat Klassen Object Metoden tostring i klassen Object I Java finns det en klass Object som är superklass till alla andra klasser. En referensvariabel av typen Object kan alltså referera till objekt av alla klasser. Exempel: Object obj = new Car("ABC123", p1, 5); I klassen Object finns det några metoder (t.ex. tostring och equals) som alla andra klasser ärver. /** Skapar en läsbar representation av objektet. */ String tostring(); När man skriver ut ett objekt på skärmen, t ex: Car c = new Car("ABC123", p1, 5); System.out.println(c); så är det metoden tostring som används inuti println. Man kan definiera om (överskugga, override) metoden tostring så att man får exakt den utskrift man vill ha. Man kan t.ex. lägga till följande metod i klassen Car: public String tostring() { return licensenbr;

Metoden equals i klassen Object Att göra Point jämförbar /** Undersöker om detta objekt är lika med obj. */ boolean equals(object obj); Metoden equals i Object fungerar likadant som ==, d.v.s. jämför referenser. Object.equals används för klasser utan egen equals-metod. I följande exempel returnerar equals därför värdet false trots att bägge bilarna har samma värden på attributen: Car c1 = new Car("ABC123", p1, 5); Car c2 = new Car("ABC123", p1, 5); c1.equals(c2); Man kan själv definiera om (överskugga/override) metoden equals så att den jämför innehållet i objekten istället. Detta är gjort i klasserna String och StringBuilder. ArrayList-metoden contains fungerar bara om elementklassen har en equals-metod. Vår klass Polygon har element av klassen Point. public class Point { private int x; private int y; //... konstruktorer och metoder public boolean equals(object obj) { if (! (obj instanceof Point)) { return false; // obj är inte ett Point-objekt Point p = (Point) obj; return x == p.x && y == p.y; Inläsning från tangentbordet Inläsning från fil För att läsa det användaren skriver på tangentbordet använder man ett Scanner-objekt: public class ScannerExample1 { public static void main(string[] args) { Scanner scan = new Scanner(System.in); int sum = 0; while (scan.hasnextint()) { sum = sum + scan.nextint(); System.out.println("Summa: " + sum); Man kan också koppla ett Scanner-objekt till en textfil: public class ScannerExample2 { public static void main(string[] args) { try { Scanner scan = new Scanner(new File("indata.txt")); //... läs som tidigare catch (FileNotFoundException e) { System.out.println("Filen kunde inte öppnas");

try-catch-sats Satsen try-catch är till för att hantera vissa felsituationer, exempelvis om en fil inte går att öppna. (Mer om detta i fördjupningskursen.) Under try körs de satser som kan ge upphov till fel. Satserna under catch körs om felet uppstår. try { // Här försöker vi öppna filen indata.txt Scanner scan = new Scanner(new File("indata.txt")); // Här kan vi läsa från filen int n = scan.nextint(); catch (FileNotFoundException e) { // Dessa satser körs om filen inte kan öppnas, // t. ex. om filen indata.txt inte finns Utskrift på fil public class PrintWriterExample { public static void main(string[] args) { try { PrintWriter out = new PrintWriter(new File("utdata.txt")); //... utskrifter med out.print hamnar på filen out.close(); catch (FileNotFoundException e) { System.out.println("Filen kunde inte öppnas"); Inlämningsuppgift 2: redovisas vecka 20 BankApplication Bank Customer ArrayList Lunds Tekniska Högskola Xxxxxxxxxxxxxxxx Xxxxxxxxxxxxxx ÅÅÅÅ-MM-DD