Föreläsning 7: Att skriva egna klasser

Slides:



Advertisements
Liknande presentationer
Föreläsning 9 Programmeringsteknik och Matlab 2D1312/2D1305
Advertisements

Interface.  Interface är en datatyp och har alltså egen syntax och en hel del egna regler för vad arv från interface innebär.  Interface är renodlad.
Array Skriv ett program som frågar följande: ”Hur många tal vill du mata in?” användaren matat in ett tal t.ex n. då frågar programmet n ggr följande.
Klasser och objekt.
Next previous Internetprogrammering 2000 Internetprogrammering 2000 Föreläsning 10 Distribuerad programmering med Javas RMI, Remote Method Invocation.
Klassarv och inkapsling
OOP Objekt-orienterad programmering
Metoder i java Det finns två typer av metoder i java
Objektorienterad tänkande
Polymorfism.
Programmeringsteknik för K och Media
Föreläsning 13 Allt om tentan. Sistaminutenhjälp: På fredag 17 december kl 12 sitter Linda i kemi-fiket och svarar på frågor.
Programkodens uppbyggnad
Föreläsning 6 Referenser Objekt som parametrar public/private Klassvariabler och klassmetoder.
1 Föreläsning 6 Klass Object, instans av klass public/private Klassvariabler och klassmetoder.
Alice in Action with Java
i olika programmeringsspråk
Jonny Karlsson INTRODUKTION TILL PROGRAMMERING Föreläsning 7 ( ) INNEHÅLL: -Klasser och instansvariabler -Tabeller av klassobjekt.
Objektorienterad programmering i Java
OOP F4:1 Marie Olsson OOP Objekt-orienterad programmering Föreläsning 4 Metoder klass-metoder instans-metoder.
Programmering i C# 3. Klasser.
Föreläsning 2, Kapitel 2 Att förstå klassdefinitioner Kursbok: “Objects First with Java - A Practical Introduction using BlueJ”, David J. Barnes & Michael.
Jonny Karlsson INTRODUKTION TILL PROGRAMMERING Föreläsning 6 ( ) INNEHÅLL: -Mera om tabeller.
Klasser och objekt Klasser, objekt och instansvariabler
int res2=Math.max(tal1,tal2);
Föreläsning 2 Kort Översikt Över Javaspråket. Källkodsformat Unicode används åäöμψζ tillåtna Inte alla miljöer klarar av det Källkod Bytekod Java VM för.
Vektorer (klassen Vector) Sortering
Mer om arv - Polymorfism Kursbok: “Objects First with Java - A Practical Introduction using BlueJ”, David J. Barnes & Michael Kölling Fredric Ragnar
Programmeringsteknik för Media1 & K1
1 Föreläsning 7 Repetition Instansvariabler och klassvariabler Klassmetoder och Instansmetoder.
Mitt första Java program Mahmud Al Hakim Copyright, Mahmud Al Hakim, 1.
Jonny Karlsson INTRODUKTION TILL PROGRAMMERING Föreläsning 7 ( ) INNEHÅLL: -Klasser -Att definiera egna klasser -Klassvariabler -Klassmetoder.
Föreläsning 8 Arv och abstrakta klasser. Arv Definierar en klass utifrån en redan existerande klass Den nya klassen utökar den ärvda klassen ( extends.
Jonny Karlsson INTRODUKTION TILL PROGRAMMERING Föreläsning 8 ( ) INNEHÅLL:Klasser: -Konstruktorer -Klassvariabler -Instansmetoder -Privata.
Jonny Karlsson INTRODUKTION TILL PROGRAMMERING Föreläsning 7 ( ) INNEHÅLL: -Metoder -Lokala variabler -Mera om klasser: -Nyckelorden.
1 Föreläsning 6 Programmeringsteknik och Matlab 2D1312/2D1305 Metoder & parametrar Array API och klassen ArrayList.
Next previous RMI, Remote Method Invocation Om du har boken av Marty Hall, läs avsnitt 15.8 För fler exempel se:
Föreläsning 1 Reserverade ord Javas API Identifierare Litteraler Variabler Kompilering och interpretering.
Föreläsning 9 Gränssnitt. Super Super kan användas till anrop av en omdefinierad metod Super kan användas till anrop av konstruktorer i superklassen Super.
Jonny Karlsson INTRODUKTION TILL PROGRAMMERING Föreläsning 5 ( ) INNEHÅLL: -Metoder.
Föreläsning 12 Om slutprovet. Repetition –deklaration av variabler –skapande av objekt (instansiering) –Vektorer och Vector-klassen –Klasser –Instans-/klassvariabler.
Föreläsning 4 Klasser Och Objekt.
1. Ett problem/uppgift.
INTRODUKTION TILL PROGRAMMERING
Föreläsning 13 Appletprogram/fristående grafiska program Arv Rita linjer, rektanglar mm Skriva text, byta färg Appletprogram & HTML Grafiska användargränssnitt.
OOP F5:1 Stefan Möller OOP Objekt-orienterad programmering Föreläsning 5 Klasser och objekt Skapa objekt - new Referenser Konstruktorer Inkapsling.
Övning 3. Repetition Metoder class RepetitionMetoder { public static void main(String [] args) double längd = 2.0; double bredd = 1.0; double area =
Föreläsning 5 Objekt Klasser Konstruktorer Metoder Minnesbilder av objekt.
Programmeringsteknik för K och Media
Föreläsning 5 Klasser och instanser
Föreläsning 7 Repetition Sammansatta datatyper –vektor (hakvektor, array) –matris.
OOP - teori1 OOP del II– Föreläsning 5 vecka 6. OOP - teori2 Klasser Substantiv i singularis stavat med stor bokstav till exempel Human Dog Account Circle.
1 Föreläsning 2 Reserverade ord Javas API Identifierare Litteraler Variabler Kompilering och interpretering.
1 Föreläsning 6 Repetition på metoder Referenser Objekt som parametrar public/private Klassvariabler och klassmetoder.
Föreläsning 7 Metoder Parametrar Klassmetod.
OOP&M - teori1 OOP – Föreläsning 7 (Sista oop I) Konstruktioner för att hantera upprepningar Kapitel 11.
1 Föreläsning 4 Metoder & parametrar Array API och klassen ArrayList.
OOP&M - teori1 OOP del II– Föreläsning 2 vecka 46 Konstruktorer Instansmetoder Kapitel 14 i kursboken.
Malmö högskola Rolf Axelsson 2003/2004 DA7231, 4 poäng Referensvariabel Klass och konstruktorer Klass med set- och get-metoder Klass och fält Fler metoder.
1 Föreläsning 7 Repetition Instansvariabler och klassvariabler Klassmetoder och Instansmetoder.
Arv, abstrakta klasser och gränssnitt
OOP&M - teori1 OOPM del II– Föreläsning vecka Mer om ärvning.. Abstrakta klasser/metoder Gränssnitt/Interface klasser.
Föreläsning 3 Väsentliga delar i ett Javaprogram Input i paketet extra
1 Mer om metoder, variabler, klasser och objekt. Kursboken: - Kapitel 6 - Kapitel 8.
Föreläsning 3: Booleans, if, switch
Föreläsning 8: Exempel och problemlösning
Föreläsning 12: Exempel och problemlösning
Föreläsning 9: Arv och UML
Föreläsning 5: Att använda klasser & objekt
Föreläsning 10: Abstrakta klasser, gränssnitt
Presentationens avskrift:

Föreläsning 7: Att skriva egna klasser TDA 545: Objektorienterad programmering 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 @author, @param, @return, @throws Exempel på taggar:

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) { // 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() {

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.

this hänvisar till detta objekt Fyller i med kod Koden implementerar specifikationen. 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; this hänvisar till detta objekt Man bör kompilera och provköra när man skriver implementationen.

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: Car Beteende, klassmetoder: sätta/hämta adressen konvertera miles till km getAuthAddress() milesToKm(…) adressen av trafiksäkerhetsv. Tillstånd, klassvariabler: authAddress 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(…)

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! Alla variabler är här publika dvs 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! Alla variabler är här publika dvs 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 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; } Alla variabler är här publika dvs kan ändras utifrån klassen…

public… Var försiktig med public! Alla variabler är här publika dvs 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 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; } Alla variabler är här publika dvs kan ändras utifrån klassen…

public… Var försiktig med public! Alla variabler är här publika dvs 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 … 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; } 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…

private Normalt ska tillståndet vara private. fungerar ej längre! 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 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; } fungerar ej längre!

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 Car enBil = new Car(); enBil.setSpeed(50); Nu kan vi ändra på farten via en metod: 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? private static String address = ""; ... public static void changeTSV_Address(String newAddress) { address = newAddress; } Man skriver en statisk metod:

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: 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; ... } metodens namn är klassnamnet Obs. ingen returtyp 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: 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. int i = 0; // deklarera en räknare i = i+1; // öka i med ett System.out.println(); // Tomrad 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(); // police starts going FastCar car2 = new FastCar("Police Volvo", 70); while (car1.getPos() > car2.getPos()) { car2.go(); System.out.println(car1.toString()); System.out.println(car2.toString()); System.out.println(); }