TDDD78 Introduktion till OOP i Java

Relevanta dokument
TDDD78 Introduktion till OOP i Java

TDDD78 Introduktion till OOP i Java

TDDD78, TDDE30, 729A Introduktion till objektorienterad programmering i Java

TDDD78 Viktiga begrepp, del 2

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

TDDD78 Objektorientering i Java, del 4. Hur vet man om två objekt är lika? Hur undviker man objekt och när?

Objektorientering: Lagring, räckvidd och livstid

Objektorientering: Lagring och livstid

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

Introduktion till objektorientering. Vad är objektorientering egentligen? Hur relaterar det till datatyper? Hur relaterar det till verkligheten?

Introduktion till Datalogi DD1339. Föreläsning 2 22 sept 2014

Typhierarkier del 1 Gränssnitt, ärvning mellan gränssnitt, ärvning mellan klasser

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

TDDD78 Objektorientering: Lagring och livstid

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

TDDD78 Viktiga begrepp i programmering / objektorientering

Introduktion till objektorientering. Vad är objektorientering egentligen? Hur relaterar det till datatyper? Hur relaterar det till verkligheten?

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

Introduktion till objektorientering. Vad är objektorientering egentligen? Hur relaterar det till datatyper? Hur relaterar det till verkligheten?

Tentamen OOP

Motivation. Programmeringsuppgift: En första ansats: Lagra info om anställda Håll reda på varje anställds närmaste chef. som också är en anställd!

Introduktion till objektorientering. Vad är objektorientering egentligen? Hur relaterar det till datatyper? Hur relaterar det till verkligheten?

Föreläsning 3-4 Innehåll

Föreläsning 2 Objektorienterad programmering DD1332. Typomvandling

TDDD78 Objektorientering i Java, del 2

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

Classes och Interfaces, Objects och References, Initialization

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

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

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

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

732G Linköpings universitet 732G11. Johan Jernlås. Översikt. Repetition. Felsökning. Datatyper. Referenstyper. Metoder / funktioner

(Man brukar säga att) Java är... Denna föreläsning. Kompilering av Java. Historik: Java. enkelt. baserat på C/C++ Allmänt om Java

Tentamen i Programmeringsteknik I, ES,

Bankkonto - övning. Övning 2 Skriv en metod, geträntan, som returnerar räntan.

OOP Objekt-orienterad programmering

1 Egna klasser. 1.1 En punkt-klass

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

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

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

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

Fält av referenser. Konstruktorerna används för att skapa Bilar och Trafikljus.

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

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

Föreläsning 13 Innehåll

Del A (obligatorisk för alla)

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

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

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

732G Linköpings universitet 732G11. Johan Jernlås. Översikt. Repetition. Exempelduggan. Luffarschack. Koda spel

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

Objekt och klasser - Introduktion

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

Övningar Dag 2 En första klass

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

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

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

OOP Objekt-orienterad programmering

Parameteröverföring. Exempel. Exempel. Metodkropp

Datatyper och kontrollstrukturer. Skansholm: Kapitel 2) De åtta primitiva typerna. Typ Innehåll Defaultvärde Storlek

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

F2 Datatyper och variabler. ID1004 Objektorienterad programmering Fredrik Kilander

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

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

Laboration 1: Figurer i hierarki

Dynamisk bindning och polymorfism

Java, klasser, objekt (Skansholm: Kapitel 2)

TENTAMEN OOP

Typkonvertering. Java versus C

Metoder - en funktion: medel

Föreläsning REPETITION & EXTENTA

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

ITK:P1 Föreläsning 1. Programmering. Programmeringsspråket Java. Stark typning Explicit typning Strukturerat Hög säkerhet

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

Högskolan Dalarna sid 1 av 7 DI-institutionen Hans-Edy Mårtensson Sten Sundin

Objekt, Klasser, Paket m. m.

Ärvning av implementation. Ärvning av implementation, inklusive abstrakta klasser Hur ska vi ärva? När ska vi ärva?

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

TDDC77 Objektorienterad Programmering

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.

Classes och Interfaces, Objects och References Objekt-orienterad programmering och design (DIT952) Niklas Broberg, 2016

Objektorienterad programmering i Java

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

I Skapa Hej.java och skriv programmet. I Kompilera med javac Hej.java. I Rätta fel och repetera tills du lyckas kompilera ditt program

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

Objektorienterad Programmering (TDDC77)

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

TDDD78, TDDE30, 729A Introduktion till Java -- för Pythonprogrammerare

Sammansatta datatyper Generics: Parametrisk polymorfism

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.

Objekt och referenser

Exempel på användning av arv: Geometriska figurer

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

Föreläsning 2, vecka 8: Repetition

TDDD78, TDDE30, 729A Introduktion till Java -- för Pythonprogrammerare

TENTAMEN OOP

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

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

Transkript:

jonas.kvarnstrom@liu.se 2016 TDDD78 Introduktion till OOP i Java

Klasser 3 Bilar är komplicerade vi tar cirklar som exempel (ritprogram?)

En klass i Java För att lagra info om cirklar som objekt i Java: Skapa en cirkelklass Varje Java-klass är i sin egen fil, med "samma" namn (Avancerat undantag: nästlade klasser) 4 Circle.java class Circle { Definiera fält (se del 2) Definiera konstruktorer (se del 4) Definiera metoder (se del 3) Medlemmar Klassnamn använder "CamelCase": ArrayList, ProcessBuilder, StackTraceElement I singular: Inte Circles, Towers eller ArrayLists!

Egenskaper Vi har nämnt att mojänger/objekt har egenskaper Vissa kan vara konstanta, andra kan ändras efter att objektet skapas 6 Längd/höjd Färg Motorstyrka Toppfart Nuvarande fart Kvarvarande bränsle Koordinater (x,y) Radie (r)

Fält i en klass 7 Realisera egenskaperna som fält (medlemsvariabler) i en klass All kod för klassen är inuti klassdeklarationen Circle.java class Circle { double x, y; double r; Detta är en klass som talar om vilken sorts information alla cirkelobjekt ska innehålla Ännu har vi inte skapat någon cirkel! Ange datatyp för varje fält: double = 64-bitars flyttal medlemsvariabel = member variable fält = field klass = class

Namngivning Namngivning för fält: Ge beskrivande namn x,y,r OK, vedertagna förkortningar temp, foo, bar inte bra, vad är detta? index eller selectedindex? left eller livesleft? s=52 eller decksize=52? Använd Javas standard! Bra namn färre kommentarer behövs! Sträva efter självdokumenterande kod! 8 Variabler, fält, metoder: allautomförstabörjarmedstor main(), args, tvåplustvå, out, addelement(), arraylength,

Fält i objekt 9 Varje objekt vi skapar får sin egen kopia av fälten Alla cirklar har en radie Alla cirklar har varsin radie (Hur skapar man objekt? Med "new" detaljer diskuteras senare!) Datorns minne Object (data) header: x 12.7 y 4.512 r 0.0002 8-16 bytes "intern info" för Java 3*8=24 bytes för fälten Object (data) header: x 23.9 y 3.222 r 12.7 [Python2: Overhead >300 bytes, fält 72 bytes]

Tillstånd (state) 10 Varje objekt har ett nuvarande tillstånd (state) Avgörs av nuvarande värdet på samtliga fält (även de konstanta) Datorns minne Object (data) header: x 12.7 y 4.512 r 0.0002 Object (data) header: x 23.9 y 3.222 r 12.7 Två distinkta objekt med olika tillstånd tillstånd = state

Samma tillstånd Två distinkta objekt i minnet kan ha samma tillstånd Precis som två variabler kan ha samma värde x=10 y=10 x = y, men x och y är ändå olika variabler! Python: a = ("hello", "world") b = ("hello", "world") två olika listor med samma element b.append("again") bara b ändras, inte a a och b var olika listor på olika plats i minnet Datorns minne Object (data) header: x 12.7 y 4.512 r 0.0002 Object (data) header: x 12.7 y 4.512 r 0.0002 11 Samma tillstånd, men inte samma objekt

Byta tillstånd I många klasser kan objekten byta tillstånd när tiden går Datorns minne Datorns minne 12 Object (data) header: x 12.7 y 4.512 r 0.0002 Ändra värdet på y Object (data) header: x 12.7 y 8.328 r 0.0002 Fortfarande samma objekt men nytt tillstånd!

Final Om ett fält inte får/ska ändras efter att objektet skapats: Deklarera det final Person.java class Person { final String personnummer; Person(String personnummer) { this.personnummer = personnummer; 13 Circle.java class Circle { final double x, y; final double r; Allt är final klassens objekt är immutable ( oföränderliga)

Punktnotation Använd punkt för att komma åt ett fält i ett objekt Fler exempel när vi pratar om metoder 14 Circle.java class Circle { double x, y; double r; static void print(circle circ) { System.out.println("Hey! You gave me a circle!"); System.out.println("Its radius is " + circ.r);

Att gömma data 15 Fält har skyddsnivåer: private bara klassens egna metoder kan komma åt fältet Klassen har full kontroll oftast bra! public alla kan komma åt fältet Princip: Ju färre som kommer åt något, desto enklare att verifiera, ändra T.ex. svårt att ändra datatyp senare annan kod kan sluta fungera (protected, "package-protected" senare) Circle.java public class Circle { // Klasser är oftast public private double x, y; private double r; Vi ignorerar detta i många exempel återkommer senare

Beteenden 17 Objekt i verkligheten gör saker, har beteenden Spontant, "aktivt": Kamelen väljer att spotta Inte del av "vanlig" OO Se multitrådning Reaktivt, på begäran: Tryck på tutan bilen tutar Uppnås via metoder (methods) som kan anropas

Metoder Varje cirkel ska kunna beräkna sin area Deklarera en metod som returnerar detta Metoder placeras oftast efter fält 18 Circle.java public class Circle { private double x, y; private double r; public double getarea() { return Math.PI * r * r; public void setradius(double newr) { r = newr; Parametrar har typer, namn Alltid ett returvärde (typ eller void) Metod utan sidoeffekter: Påverkar inget, informerar bara Metod med sidoeffekter: Ändrar något (i detta objekt / på annan plats) sidoeffekt = side effect

Metodkroppen I metodens kropp (body) anges vad metoden ska göra Som i en "vanlig" funktion med en skillnad: Circle.java public class Circle { private double x, y; Kan direkt komma åt objektets fält! private double r; public double getarea() { return Math.PI * r * r; Men i vilket objekt? public void setradius(double newr) Vi { deklarerar "r" en enda gång. r = newr; Vi kan skapa 1000 cirklar, och var och en har en egen radie! 19

This 1: Detta objekt 20 Om vi tar bort "förkortningar": Circle.java public class Circle { private double x, y, r; public double getarea() { return Math.PI * this.r * this.r ; public static void main(string[] args) { Circle c1 = ; Circle c2 = ; double a = c1.getarea(); double b = c2.getarea(); "r" är en förkortning för "this.r" Fältet "r" i objektet "this" men vad är "this"? "this" är objektet vars metod anropades! I första anropet: this är samma objekt som c1 I andra anropet: this är samma objekt som c2 Ett objekt kan ha många "namn", giltiga i olika delar av koden!

This 2: Omskrivning 21 Nästan som om kompilatorn skrev om koden Adderade en this-parameter till varje metod public class Circle { private double x, y, r; public double getarea() { return Math.PI * this.r * this.r ; public static void main(string[] args) { Circle c1 = ; double a = c1.getarea(); "Implicit parameter": this public class Circle { private double x, y, r; public double getarea(circle this) { return Math.PI * this.r * this.r; public static void main(string[] args) { Circle c1 = ; double a = getarea(c1); (Nästan: Det finns viktiga skillnader, t.ex. i ärvning)

This 3: Utelämna this 22 Kan ofta utelämna this Givet en identifierare "r" söker kompilatorn efter: 1. Lokala variabler och parametrar "r" 2. Fält "r" public class Circle { private double x, y, r; public double getarea() { return Math.PI * this.r * this.r ; public static void main(string[] args) { Circle c1 = ; double a = c1.getarea(); "Det finns inget r, så de måste mena this.r " public class Circle { private double x, y, r; public double getarea() { return Math.PI * r * r; public static void main(string[] args) { Circle c1 = ; double a = c1.getarea();

This 4: Gömda fält Men variabler och parametrar gömmer fält ("hiding") 23 public class Circle { private double x, y, r; Olika namn (r, newr) public void setradius2(double newr) { System.out.println(r); // Finns variabel/parameter? Nej! Skriv ut fältet r = newr; // Sätter fältets värde public class Circle { private double x, y, r; public void setradius2(double r) { System.out.println(r); System.out.println(this.r); r = r; this.r = r; Samma namn (r), parameter gömmer fält // Finns variabel/parameter? Ja! Skriv ut den // Måste vara fältet // Sätter argumentet till sitt eget värde // Sätter fältets värde

Namngivning Namngivning: Som för fält: Ge beskrivande namn update() eller moveplayer()? doit() eller shuffledeck()? units() eller setunittype()? 24 Använd Javas standard! Variabler, fält, metoder: main(), args, tvåplustvå, out, println() addelement(), arraylength, allautomförstabörjarmedstor

Namngivning 2: Overloading Metoder kan överlagras (overloading) Olika metoder i samma klass med samma namn public class Printer { public void print(int val) { public void print(double val) { public void print(double val, int precision) { Skiljs åt av antal argument + argumenttyperna Användning: När metoderna gör i princip samma sak När det vore onödigt krångligt att hitta på egna namn (printint, printdouble, ) 25

Metodlängd (1) Hur lång får en metod vara? "The first rule of functions is that they should be small. The second rule of functions is that they should be smaller than that. Functions should not be 100 lines long. Functions should hardly ever be 20 lines long." -- Robert Martin, Clean Code: A Handbook of Agile Software Craftsmanship 26 "The routine should be allowed to grow organically up to 100-200 lines. Decades of evidence say that routines of such length [are] no more error prone than shorter routines." -- Steve McConnell, Code Complete

Metodlängd (2) Varför dessa motsatser? 27 Ju fler kockar desto sämre soppa Fyra ögon ser bättre än två För varje regel finns en lika stark och motsatt motregel

Metodlängd (3) 28 Målet: Kod ska vara läsbar, lätt att förstå, lätt att underhålla Långa metoder varningssignal! Är metoden osammanhängande? Gör den för mycket? Kanske det finns meningsfulla delar som kan bli egna metoder! Många korta metoder varningssignal! Är det för många metoder för att hålla reda på? Skulle det bli enklare om man kombinerade dem? Hitta rätt balans Prioritera målet (läsbarhet) istället för medlet (uppdelningen) Men: "För osammanhängande" metoder metoder är vanligare i inlämningar, kan ge komplettering

Skapande Att skapa nya listor, tupler osv. i Python: 30 tomlista = [] minlista = ["a", "b", "c"] mintupel = (12, 34, 56) mindict = { "a": 1, "b": 2 Egen syntax för varje typ Ange alla element som listan / tupeln / ska innehålla

Skapa objekt 1 31 Hur skapar man nya objekt? Generell "objektsyntax", ange värdet på varje fält? Circle mycircle = Circle[[12.7, 4.512, 0.0002]]; Datorns minne Object (data) header: x 12.7 y 4.512 r 0.0002 Nej: Många klasser har fält som ska beräknas eller kan lämnas tomma eller är privata för internt bruk Måste kunna välja vilka fält vi sätter

Skapa objekt 2 32 Hur skapar man nya objekt? Först skapa "nollställt" objekt, med alla fält "nollställda", sedan sätta önskade värden utifrån? Circle mycircle; mycircle.x = 10; mycircle.y = 20; Nej: Tillåter godtyckliga värden Listor kan innehålla vad som helst Men cirklar ska ha radie > 0 Klassen ska kunna garantera detta! Datorns minne Object (data) header: x 0 y 0 r 0 Fundamental princip: Klassen bestämmer över sina objekt (kan förhindra manipulation utifrån

Konstruktorer 1 Låt klassen ange konstruktorer, speciella metoder för att initialisera objekt 33 public class Circle { private double x, y, r; Ingen returtyp (inte void!) Samma namn som klassen public Circle(double x, double y, double radius) { Detta är en konstruktor! konstruktor = constructor

Konstruktorer 2 Ibland vill vi: Kunna sätta specifika värden på alla fält 34 public class Circle { private double x, y, r; En parameter per fält public Circle(double x, double y, double radius) { this.x = x; this.y = y; En tilldelning per fält; this.r = radius; "this" är det nya objektet public static void main(string[] args) { Circle c1 = new Circle(10.0, 20.0, 14.2); Vi anropar konstruktorn med new och anger lämpliga parametrar

Konstruktorer 3: Vad händer? 35 1: Minne allokeras (reserveras) för objektet 2: Alla fält får defaultvärden Heltal: 0 Floating point: 0.0 Boolean: Objekt: false 3: Konstruktorn anropas null (diskuteras senare) Object header: x y r (skräp) (skräp) (skräp) (skräp) Object Circle header: x 0.0 y 0.0 r 0.0 Circle(double x, double y, double radius) { this.x = x; this.y = y; this.r = radius; Fundamental princip: Klassen bestämmer över sina objekt klassen anger konstruktorkoden!

Konstruktorer 4: Kontroller Ibland vill vi: Kontrollera att bara tillåtna värden anges 36 public class Circle { private double x, y, r; public Circle(double x, double y, double radius) { if (radius <= 0.0) { Se till att radien > 0, throw signalera fel ; annars avbryts konstruktorn inget objekt skapas this.x = x; this.y = y; this.r = radius;

Konstruktorer 5 Ibland vill vi: Ta in värden i annat format än det klassen använder 37 public class Circle { private double x, y, r; public Circle(Point center, double radius) { if (radius <= 0.0) throw ; this.x = center.x; this.y = center.y; this.r = radius; Anta en "punktklass" som lagrar x, y Ta ut x och y från "centrumpunkten"

Konstruktorer 6 Ibland vill vi: Beräkna värden på fält från andra parametrar 38 public class Circle { private double x, y, r; private double area; public Circle(double x, double y, double circumference) { if (circumference<= 0.0) throw ; this.x = x; this.y = y; this.r = circumference / (2*Math.PI); Beräkna radie från omkrets this.area = Math.PI * r * r; Beräkna area från radie

Konstruktorer 7 Ibland vill vi: Sätta värden själva eftersom de är "interna" detaljer, inte något som anroparen ska bry sig om public class Circle { private double x, y, r; private int timespainted; Håll reda på antalet gånger vi har ritat cirkeln (statistik) 39 public Circle(double x, double y, double radius) { this.x = x; this.y = y; this.r = radius; this.timespainted = 0; Från början är antalet alltid 0

Konstruktorer 8 En konstruktor kan göra vad som helst 40 public class Circle { private double x, y, r; private boolean debugmode; public Circle(double radius) { System.out.println("Hello, world!"); System.exit(0); Inte vad man ska göra, men man kan

Konstruktorer 9: Kopiering Ibland kan man vilja kopiera objekt Konstruktor som tar ett objekt av samma typ 41 public class Circle { private double x, y, r; public Circle(double x, double y, double radius) { this.x = x; this.y = y; this.r = radius; public Circle(Circle other) { this.x = other.x; this.y = other.y; this.r = other.r; Kopieringskonstruktor: Tar ett objekt av samma typ

Konstruktorer 10: Overloading En klass kan ha flera konstruktorer Alla heter samma som klassen overloading 42 public class Circle { private double x, y, r; public Circle(double x, double y, double radius) { this.x = x; this.y = y; this.r = radius; public Circle(Point center, double diameter) { this.x = center.x; this.y = center.y; this.r = diameter / 2;

Konstruktorer 11: Minst en! Varje klass har minst en konstruktor Har du inte skrivit någon? Då skapar Java en tom konstruktor utan argument! public class Circle { private double x, y, r; 43 public class Circle { private double x, y, r; public Circle() { // Gör ingenting // alla fält har defaultvärden (0, 0.0, false, )