Föreläsning 7: Att skriva egna klasser

Relevanta dokument
En klass för en bil: Klassen - en typ för objekten. Hur hitta lämpliga abstraktioner? Hitta den lämpliga abstraktionen? Att skriva egna klasser

f1pt Nästa F: arv och relationer (kap 12) UML (enbart OH)

Lösningsförslag övning 2.

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

Föreläsning 2 Objektorienterad programmering DD1332. Typomvandling

Föreläsning 8 Programmeringsteknik och Matlab 2D1312/2D1305. Klass Object, instans av klass public/private Klassvariabler och klassmetoder

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

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

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

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

Laboration 3, uppgift En klass för en räknare

Kort om klasser och objekt En introduktion till GUI-programmering i Java

Java, klasser, objekt (Skansholm: Kapitel 2)

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

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

Datatyper. Programmering. Att definiera datatyper i Java. Laddade partiklar. (x,y) (Rx,Ry) hh.se/db2004

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

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

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

Chapter 4: Writing Classes/ Att skriva egna klasser.

Vad är ett objekt? Tillstånd och beteende. Vad är ett objekt? Exempel

I STONE. I Variabler, datatyper, typkonvertering. I Logiska och matematiska uttryck. I Metoder-returvärde och parametrar. I Villkorssatser if/else

Dagens föreläsning. Arrayer och klasser. Medan ni väntar: Gå till m.voto.se/prog11 och svara på några gamla tentamensfrågor! (26 januari 2018 F3 1 )

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.

Variabler som hör till enskilda objekt. Deklareras på översta nivån i klassen och i regel som private.

Objekt och klasser - Introduktion

Sammanfattning och repetition utgående från typiska tentamensuppgifter

Administrativt. Programmeringsteknik för I1. Dagens program. Objektorienterad programmering

Enkla variabler kontra referensvariabel

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

Föreläsning 3-4 Innehåll

2D1311 Programmeringsteknik för Bio1 och Bio2, vt 2003 Fiktivt prov På flervalsfrågorna är endast ett svar rätt om inget annat anges i frågan! Det rik

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

Objektorienterad Programmering DAT043

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

JAVA Mer om klasser och objektorientering

Idag. statiska metoder och variabler. private/public/protected. final, abstrakta klasser, gränssnitt, delegering. wrapper classes

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

Tentamen OOP

Objektorienterad Programmering (OOP) Murach s: kap 12-16

Objektorienterad programmering i Java

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

Överlagring, static, testning, formella metoder och undantag! Förelasning 13!! TDA540 Objektorienterad Programmering!

Objekt och klasser - Introduktion. Objekt. SparKonto.java 2. SparKonto.java 1. Konton.java. Ett objekt har: Ett bankkonto

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

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

F4 Klasser och Metoder. ID1004 Objektorienterad programmering Fredrik Kilander

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

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

Att använda Java SE JDK 6

725G61 - Laboration 7 Implementation av ett API. Johan Falkenjack

Objektorienterad Programmering (TDDC77)

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

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 för språkteknologer II, HT2011. Rum

Föreläsning 5-6 Innehåll

TUTORIAL: KLASSER & OBJEKT

Laboration 1 - Grunderna för OOP i Java

Detta dokument är ett exempel, cirka hälften av en tentamen för TDA545 Objektorienterad programvaruutveckling

Malmö högskola 2007/2008 Teknik och samhälle

Mer om klasser och objekt

F8 - Arv. ID1004 Objektorienterad programmering Fredrik Kilander

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

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

Malmö högskola 2008/2009 CTS

1 Egna klasser. 1.1 En punkt-klass

tentaplugg.nu av studenter för studenter

Kort repetition. Programmeringsteknik för Bio1 och I1. Vad ska vi lära oss idag? Ett exempel

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

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

TDDC77 Objektorienterad Programmering

Design av en klass BankAccount som representerar ett bankkonto

Övning 3. Datateknik A, Java I, 5 poäng

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

Sammanfattning och repetition utgående från typiska tentamensuppgifter

Föreläsning 2, vecka 8: Repetition

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

Metoder (funktioner) Murach s: kap Winstrand Development

Enkla variabler kontra referensvariabel

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

Föreläsning 5. Föreläsning 5

F6 Objektorienterad design. ID1004 Objektorienterad programmering Fredrik Kilander

Föreläsning 6. Mer om klasser och objekt. Enkla variabler kontra referensvariabel. Omslagsklassen Integer. Referensvariabler

Föreläsning 6: Metoder och fält (arrays)

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

Föreläsning 3: Booleans, if, switch

Objektorienterad programmering Föreläsning 5

DAT043 - Föreläsning 7

Föreläsning 2. Täcker material från lektion 1, 2, 3 och 4:

Grundläggande programmering med C# 7,5 högskolepoäng

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

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

Objekt, Klasser, Paket m. m.

Anmälningskod: Lägg uppgifterna i ordning. Skriv uppgiftsnummer (gäller B-delen) och din kod överst i högra hörnet på alla papper

2203$( Föreläsning ii - Mer om Java bla this och konstruktorer. Exempel: lampa

Objektorienterad programmering E. Telefonboken, än en gång. Gränssnitt. Telefonboken med gränssnitt specificerat, del 1.

Anmälningskod: Lägg uppgifterna i ordning. Skriv uppgiftsnummer (gäller B-delen) och din kod överst i högra hörnet på alla papper

Det är principer och idéer som är viktiga. Skriv så att du övertygar examinatorn om att du har förstått dessa även om detaljer kan vara felaktiga.

OBJEKTORIENTERAD PROGRAMVARUUTVECKLING

Transkript:

TDA 545: Objektorienterad programmering Föreläsning 7: Att skriva egna klasser Magnus Myréen Chalmers, läsperiod 1, 2015-2016

Idag Läsanvisning: kap 2; för nästa gång: kap 10 och 15 att konstruera en klass Javadoc en bilklass

Påminnelse om klasser och objekt new skapar nya objekt, dvs nya instanser av en klass.

Hur hittar man lämpliga abstraktioner? 1. Vad ska objekten vara? Identiteten. Objekt är vanligen saker, dvs substantiv. 2. Vad vill du kunna göra med objektet? Beteende. Instansmetoderna, dvs vad som kan göras med objektet (verb!) 3. Vilka egenskaper skall/måste lagras? Tillstånd. I instansvariabler lagras egenskaper hos objektet (adjektiv!).

En klass för en bil 1. Vad ska objekten vara? I detta fall en bil. 2. Vad vill du kunna göra med objektet? tilldela bilnummer (en gång) skriva/rita ut det bestäm färg? sätt hastighet? öka/minsta hastighet... sätt startposition? flytta absolut och relativt? 3. Vilka egenskaper/tillstånd måste lagras? bilnummer färg hastighet Vilka egenskaper skall kunna ändras? Hur ser då gränssnittet ut?

En klass för en bil Klassens namn: Car Tillstånd, instansvariabler: bilnummer märke och modell hastighet, körda km carnumber brand speed, distance Beteende, instansmetoder: kör framåt/bakåt sätt hastighet till x sätt färg tanka drive() setspeed( ) setcolour( ) refuel( )

Skiss import java.awt.color; public class Car { // constructors public Car () { public Car (String carnumber) { // mutators ("setters") public void setspeed (int x) { public void setcolor (Color newcolor) { // frågor ("getters") public Color getcolor() { public int getspeed() { public int getx () { // other public void refuel (double liters) {

Specifikation och Implementation black-box tänkande En specifikation (metodsignaturer + javadoc) talar om vad som kan göras med ett objekt Implementationen förverkligar löftena i specifikationen. En specifikation kan ha flera olika implementationer.

Specifikation: Javadoc Java använder programmet javadoc för att skapa en beskrivning av specifikationen. Javadoc läser Java-koden och extraherar ut metodernas signatur och speciella kommentarer och taggar. Javadoc kommentar: /** * Text som beskriver metoden. * olika taggar som * @author Magnus Myreen */ metodens deklaration här Exempel på taggar: @author, @param, @return, @throws

metodsignatur + javadoc = specifikation metodsignatur + javadoc = specifikation import java.awt.color; /** * A class for representing a car. * <p>(det är skillnad på första raden * och de övriga här * <br>första raden skall börja på stor * bokstav och avslutas med punkt.) * <br>the state includes car number, * speed and color. * @author Magnus Myreen * @version 1.15126 *///HTML kod funkar i javadoc kommentarer. public class Car { public Car () { ; // tomt ännu så länge public Car (String carnumber) { ; // tomt ännu så länge // mutators ("setters") /** * Set the speed of the car. * Checks the speed for reasonable * values i.e. - 40<= speed <= 200 * @param x the new speed */ public void setspeed (int x) { ; /** * Set the color of the car. * @param newcolor the new color */ public void setcolor (Color newcolor) { ; // tomt ännu så länge // accessors ("getters") /** * Kommentarerna för getters är vanligen * rätt torftiga... */ public Color getcolor() { ; public double getspeed() { ; // annat public void refuel(double liters){ // tomt ännu så länge /** * tostring är en standard metod som * man alltid skall skriva */ public String tostring() { // tomt ännu så länge

javadoc $ mkdir Car- doc $ cd Car- doc/ $ javadoc../car.java Loading source file../car.java... Constructing Javadoc information... Standard Doclet version 1.7.0_67 Building tree for all the packages and classes... Generating /Car.html... Generating /package- frame.html... Generating /package- summary.html... Generating /package- tree.html... Generating /constant- values.html... Building index for all the packages and classes... Generating /overview- tree.html... Generating /index- all.html... Generating /deprecated- list.html... Building index for all classes... Generating /allclasses- frame.html... Generating /allclasses- noframe.html... Generating /index.html... Generating /help- doc.html...

vad gjorde javadoc? $ ls - la total 160 drwxr- xr- x 17 mom22 staff 578 17 Sep 10:05. drwxr- xr- x 29 mom22 staff 986 17 Sep 10:05.. - rw- r- - r- - 1 mom22 staff 10297 17 Sep 10:05 Car.html - rw- r- - r- - 1 mom22 staff 569 17 Sep 10:05 allclasses- frame.html - rw- r- - r- - 1 mom22 staff 549 17 Sep 10:05 allclasses- noframe.html - rw- r- - r- - 1 mom22 staff 3287 17 Sep 10:05 constant- values.html - rw- r- - r- - 1 mom22 staff 3237 17 Sep 10:05 deprecated- list.html - rw- r- - r- - 1 mom22 staff 7643 17 Sep 10:05 help- doc.html - rw- r- - r- - 1 mom22 staff 5709 17 Sep 10:05 index- all.html - rw- r- - r- - 1 mom22 staff 2664 17 Sep 10:05 index.html - rw- r- - r- - 1 mom22 staff 3448 17 Sep 10:05 overview- tree.html - rw- r- - r- - 1 mom22 staff 689 17 Sep 10:05 package- frame.html - rw- r- - r- - 1 mom22 staff 1 17 Sep 10:05 package- list - rw- r- - r- - 1 mom22 staff 3711 17 Sep 10:05 package- summary.html - rw- r- - r- - 1 mom22 staff 3457 17 Sep 10:05 package- tree.html drwxr- xr- x 6 mom22 staff 204 17 Sep 10:05 resources - rw- r- - r- - 1 mom22 staff 11139 17 Sep 10:05 stylesheet.css $ open index.html

Resultatet

Resultatet

Resultatet

Olika javadoc taggar @author Författare. Flera är ok. @version Nuvarande version @since När denna feature infördes @param Parametrarnas accepterbara värden och deras betydelse. Flera är ok. @return Betydelse och möjliga värden på resultatet @see Länk till annan dokumentation @throws Ev. exception som kastas av en metod För mer om javadoc gör kommandot man javadoc

Implementera black-box tänkande En specifikation (metodsignaturer + javadoc) talar om vad som kan göras med ett objekt Implementationen förverkligar löftena i specifikationen. En specifikation kan ha flera olika implementationer.

Fyller i med kod Koden implementerar specifikationen. this hänvisar till detta objekt Man bör kompilera och provköra när man skriver implementationen. public class Car { private String carnumber; private Color col; private double speed = 0.0; public Car (String carnumber) { this.carnumber = carnumber; // mutators ("setters") /** * Set the speed of the car. * Checks the speed for reasonable * values i.e. - 40<= speed <= 200 * @param x the new speed */ public void setspeed (int x) { // TODO: check speed speed = x;

En testklass Koden implementerar specifikationen. skapar två nya bilar import java.awt.color; public class CarTest { public static void main (String[] args) { Car car1 = new Car ("ABC 123"); Car car2 = new Car ("YXZ 890"); car1.setcolor(color.red); car1.setspeed(14); car2.setcolor(color.black); car2.setspeed(29); System.out.println("car 1 = " + car1.tostring()); System.out.println("car 2 = " + car2);

Vissa saker är gemensamma för alla objekt Klassens namn: Tillstånd, klassvariabler: adressen av trafiksäkerhetsv. Tillstånd, instansvariabler: bilnummer märke och modell hastighet, körda km Beteende, klassmetoder: sätta/hämta adressen konvertera miles till km Beteende, instansmetoder: kör framåt/bakåt sätt hastighet till x sätt färg tanka Car authaddress carnumber brand speed, distance getauthaddress() milestokm( ) drive() setspeed( ) setcolour( ) refuel( )

Klasser - en typ för objekten En klass innehåller en beskrivning av (en mall för, en definition av) tillståndet (dvs variabler) och beteendet (dvs metoder) hos de objekt som skapas av klassen. Klassen är en beskrivning av tex hur en bil ser ut och av vad man kan göra med den. Klassvariabler: Alla bilar har samma adress till trafiksäkerhetsverket. Det är alltså en egenskap som finns hos klassen snarare än hos objektet. Klassmetoder: anropas utan objekt (eftersom inget objekt behövs). Man anropar klassen för att få reda på TSV adressen. Instans[variabler/metoder]: variabeln eller metoden är bunden till ett objekt (tex ändra hastighet). Man anropar ett objekt. Varje objekt har sina egna instansvariabler / instansmetoder. Dessa beskriver ju objektets tillstånd.

static Använda static för att deklarera klassvariabler/metoder. public class BilClass1 { public static String authaddress; public static int numberofcars; public String brand; public String carnumber; public double speed; public int totalkm;... // end BilClass1

public Var försiktig med public! public class BilClass1 { public static String authaddress; public static int numberofcars; public String brand; public String carnumber; public double speed; public int totalkm;... // end BilClass1 Alla variabler är här publika dvs kan ändras utifrån klassen

public Var försiktig med public! public class BilClass1 { public static String authaddress; public static int numberofcars; public String brand; public String carnumber; public double speed; public int totalkm;... // end BilClass1 Alla variabler är här publika dvs kan ändras utifrån klassen public class BilTest1 { public static void main (String[] args) { // skapa ett bil objekt BilClass1 enbil = new BilClass1(); // ge värden enbil.carnumber = "ABC123"; enbil.totalkm = 250; enbil.speed = 90; System.out.println(enBil.carNumber); enbil.totalkm = enbil.totalkm - 500; BilClass1.numberOfCars += 1;

public Var försiktig med public! public class BilClass1 { public static String authaddress; public static int numberofcars; public String brand; public String carnumber; public double speed; public int totalkm;... // end BilClass1 Alla variabler är här publika dvs kan ändras utifrån klassen public class BilTest1 { public static void main (String[] args) { // skapa ett bil objekt BilClass1 enbil = new BilClass1(); // ge värden enbil.carnumber = "ABC123"; enbil.totalkm = 250; enbil.speed = 90; System.out.println(enBil.carNumber); enbil.totalkm = enbil.totalkm - 500; BilClass1.numberOfCars += 1;

public Var försiktig med public! public class BilClass1 { public static String authaddress; public static int numberofcars; public String brand; public String carnumber; public double speed; public int totalkm;... // end BilClass1 Alla variabler är här publika dvs kan ändras utifrån klassen här ändrar vi bilens nummer här ändrar vi på totala körda km justerar vi antalet bilar som finns allt detta utanför bil klassen! public class BilTest1 { public static void main (String[] args) { // skapa ett bil objekt BilClass1 enbil = new BilClass1(); // ge värden enbil.carnumber = "ABC123"; enbil.totalkm = 250; enbil.speed = 90; System.out.println(enBil.carNumber); enbil.totalkm = enbil.totalkm - 500; BilClass1.numberOfCars += 1;

private Normalt ska tillståndet vara private. public class BilClass1 { private static String authaddress; private static int numberofcars; private String brand; private String carnumber; private double speed; private int totalkm;... // end BilClass1 fungerar ej längre! public class BilTest1 { public static void main (String[] args) { // skapa ett bil objekt BilClass1 enbil = new BilClass1(); // ge värden enbil.carnumber = "ABC123"; enbil.totalkm = 250; enbil.speed = 90; System.out.println(enBil.carNumber); enbil.totalkm = enbil.totalkm - 500; BilClass1.numberOfCars += 1;

Tillståndet ska ändras genom metoder metoderna kan kolla att tillståndet blir vettigt. public void setspeed(double newsp){ if ((newsp >= 0) && (newsp <= 200)) { speed = newsp; else { // generera felmeddelande här // end setspeed Nu kan vi ändra på farten via en metod: Car enbil = new Car(); enbil.setspeed(50); Metoden kan också göra andra saker, t.ex. hålla log på vilka hastigheter som bilen kört.

Hur "läsa" privata variabler? Man skriver en accessor i klassen Car: public double getspeed() { return speed; Det viktiga är att det är klassen som bestämmer hur ett värde sätts och vad som returneras av en get-metod.

Hur hanterar man statiska variabler? Man skriver en statisk metod: private static String address = "";... public static void changetsv_address(string newaddress) { address = newaddress;

Hur gör man med bilnumret då? Det skall ju inte gå att ändra när det väl är satt men man måste kunna ge det ett värde. Lösning: skapa en konstruerare i vilken man sätter bilnumret: Obs. ingen returtyp metodens namn är klassnamnet public Car(String carnumber) { // spara parametrar // gör ev. rimlighets kontroll this.carnumber = carnumber; numberofcars = numberofcars + 1; // nollställ och gör vad som behöver // göras för att skapa en bil totalkm = 0; this.speed = 0;... Om carnumber är private och vi inte skriver en set-metod, så går det ej att ändra på instansvariabeln carnumber.

Constructor en konstruktor: har samma namn som sin klass konstruerar och initialiserar kan ej anropas direkt bara automatiskt av new är vanligen publik har ingen returtyp kan finnas 0 eller flera this hänvisar till det implicita objektet dvs mig själv

Att komma åt objektets data och metoder Inuti objektet, dvs när man skriver kod för själva objektet, använder man bara namnet på det man vill referera. <variabel> this.<variabel> <metodnamn>(...) Utanför objektet, dvs när man skriver ett program som använder sig av objektet så använder man olika notation beroende på om det man vill referera är statisk eller inte. För instansvariabler/metoder: <objektnamn>.<variabel> <objektnamn>.<metodnamn>(...) För statiska variabler/metoder: <Klassnamn>.<variabel> <Klassnamn>.<metodNamn>(...)

Bra/dåliga kommentarer Skall tillföra något, förklara svåra saker underkommentera inte överkommentera inte Dåliga kommentarer tillför ingen information: int i = 0; // deklarera en räknare i = i+1; // öka i med ett System.out.println(); // Tomrad Man kan däremot tala om vad man skall använda räknaren i till (men ännu bättre är kanske att hitta ett bättre namn) och man kan tala om varför man ökar i. Bra kommentar: // vi ökar med 2 för att bara få med udda tal i = i+2;

Begrepp klass, objekt/instans klassmetoder, instansmetoder get och set metoder public och private static constructor javadoc

Programmeringsuppgift Skriv ett program som simulerar bilar.

import java.util.random; public class FastCar { private String name; private int speed; private int pos; private Random t; public FastCar(String name, int speed) { this.name = name; this.speed = speed; this.pos = 0; this.t = new Random(); public int getpos() { return pos; public void go() { if (t.nextint(5) == 0) { System.out.println(name + " got a boost from the wind!"); pos = pos + 10; pos = pos + speed; public String tostring() { return name + " is at " + pos + " from origin.";

public class CarChase { public static void main (String[] args) { FastCar car1 = new FastCar("Souped- up Lada", 50); // crime happens car1.go(); car1.go(); car1.go(); car1.go(); // police starts going FastCar car2 = new FastCar("Police Volvo", 70); while (car1.getpos() > car2.getpos()) { car1.go(); car2.go(); System.out.println(car1.toString()); System.out.println(car2.toString()); System.out.println();