Översikt Vad är det som händer när man kör Java? – Introduktion till Java – (del2) Kompilator (före körning) Interpretator (under körning) Statisk vs. dynamisk variabelbindning Parameter-passing Användbara datastrukturer – – – Call by value i Java Arrayer Arraylistor Programmering — tillämpningar och datastrukturer Köra Java Bindning Köra Java Köra Java >> javac MyCode.java Bindning Producerar MyCode.class – Maskin/operativsystems-beroende kod för Java Virtual Machine (JVM) 2 Program i Java Filstruktur i NetBeans – Par.passing Arrayer Par.passing >> java MyCode – Varje klassdefinition i egen fil Arrayer Koden tolkas (interpreteras) steg-försteg under körning Biblioteksfiler (paket) ArrayList ArrayList Programmering — tillämpningar och datastrukturer 3 Programmering — tillämpningar och datastrukturer Köra Java Kompilering Köra Java Bindning källkod Bindning Par.passing Par.passing Hello.java kompilator Arrayer Hello.class Arrayer Javabytekod ArrayList Programmering — tillämpningar och datastrukturer 5 ArrayList 4 JVM Hello.class Unix Windows Darwin RAM RAM RAM CPU CPU CPU AMD Intel Mac Programmering — tillämpningar och datastrukturer 6 1 Köra Java Bindning Köra Java Mjukvarudator Java Virtual Machine (JVM) Bindning Implementeras olika på olika plattformar – Interpreterar Java-program (.class) Varför i två steg? 1. – Par.passing Arrayer Kompilering av källkod (.java) – Finns aldrig några maskinkodsfiler (exe-filer, eller bin-filer) för användarens program Par.passing Build (flera filer som ska kopplas samman) 2. Interpretering av bytecode (.class) Arrayer ® Gör språket Java plattformsoberoende! ArrayList ® Möjliggör dynamisk bindning Interpretering – Dels operativsystemsberoende – Dels hårdvaru-beroende ArrayList Solaris, Darwin, Windows Unix, Mac, PC Gäller speciellt grafiken Programmering — tillämpningar och datastrukturer Köra Java 7 Programmering — tillämpningar och datastrukturer Köra Java Att köra program Bindning Bindning filsystem Par.passing Par.passing Arrayer RAM 8 Arrayer cache Compiling import java.util.*; import java.util.*; … … myList.add(elem); java.util.myList.add(elem); … … Djur d = getNext(myList); Djur d = getNext(myList); d.presenteraDig(); d.presenteraDig(); förinladdning av material som snart kommer att behövas ArrayList ArrayList CPU Programmering — tillämpningar och datastrukturer Köra Java Bindning 9 Varför interpreterat? Polymorfism – dvs. samma namn på metod i superklass och subklass – Köra Java Ex.vis. fågel.flyga och pingvin.flyga Par.passing Arrayer Programmering — tillämpningar och datastrukturer Bindning Par.passing Problem: objekt skapas dynamiskt under körning – Arrayer Går inte att veta i förväg vilken flyga som ska länkas in i koden ArrayList ArrayList Programmering — tillämpningar och datastrukturer 11 metoddefinition 10 Polymorfism Fågel fågel; String fågelTyp; fågelTyp = JOptionPane.showInputDialog(“Which bird do you want to create, Penguin (P) or Dove (D)?"); if (fågelTyp == “P”) { fågel = new Pingvin(); } else { fågel = new Duva(); } Fågel.flyga() … eller fågel.flyga(); Pingvin.flyga() Programmering — tillämpningar och datastrukturer 12 2 Köra Java Varför interpreterat? Bindning Köra Java Bindning Par.passing Arrayer Omöjligt att i förväg veta vilken metod (= kod) som kommer att behöva exekveras Kräver dynamisk bindning av variabel (t.ex. flyga) till innehåll (t.ex. koden för Pingvin.flyga) Variabelbindning Två sätt att veta till vilket värde en variabel ska bindas: Bestäms av syntaktiska strukturen hos koden i filen 2. Bestäms av exekveringsflödet genom koden (kontrollstrukturen) 1. Par.passing Arrayer – – ArrayList ArrayList Programmering — tillämpningar och datastrukturer Köra Java Bindning 13 Variabelbindning (Lisp) (let ((n 1)) (defun addn (z) (add n z))) Par.passing ... Länka in detta n eftersom definitionen av addn sitter i den här omgivningen Programmering — tillämpningar och datastrukturer Köra Java Bindning (addn 3)) Arrayer Variabelns värde bestäms av dess plats i programmet – Par.passing detta n eftersom anropet sker i den här kontexten Statisk bidning → 4 Dynamisk bindning → 5 Programmering — tillämpningar och datastrukturer Köra Java Bindning Programmering — tillämpningar och datastrukturer Köra Java Bindning Ex. språk med statisk bindning Implementeras genom interpretering, dvs. att programmet tolkas en sats i taget under körning Common Lisp använder statisk bindning Fria variabler binds vid definitionstillfället – Hela definitionsomgivningen skickas med när funktionen skickas som argument till annan funktion Par.passing Löses genom dynamisk bindning 16 – Par.passing Arrayer → Kompilatorn ersätter variabeln med rätt värde eller kod i exe-filen Arrayer 15 Variabelns (funktionsnamns) värde kan inte säkert bestämmas förrän programmet körs Binds inom närmast omslutande programblock där variabeln är deklarerad ArrayList Dynamisk bindning 14 Statisk bindning (let ((n 2)) ArrayList Kan påverkas av if-then-satser, användarinput, etc. Dynamisk Arrayer ArrayList Obs! InterLisp, etc. använder dynamisk bindning ArrayList Programmering — tillämpningar och datastrukturer 17 Programmering — tillämpningar och datastrukturer 18 3 Köra Java Bindning Java Måste använda dynamisk bindning – Par.passing Bindning Parametrar – argument P.g.a. polymorfism Därför körs JVM interpreterat Par.passing Plussidan: flexibilitet – Nackdel: långsam – Arrayer Köra Java Just-in-time kompilering ger något förbättrad prestanda public static int add(int a, int b) { … } ArrayList ArrayList Köra Java Bindning 19 Anropssätt Math.add(3,4) Call-by-value Köra Java Bindning Skicka värdet – Kopia – Par.passing Skicka en referens Original Arrayer Kompromiss Bindning 21 Call-by-name Arrayer ArrayList Anrop misse.sättÅlder(ålder+1); Köra Java Bindning Steg1: Ersätt parametern på alla platser i metod-kroppen med ålder+1 – Steg2: Börja exekvera metoden – Steg3: Evaluera argumentet vid behov (dvs. om programmet hamnar där) ® Slipper evaluera ”farliga” argument (som skulle ha gett oändlig loop) – Argument kan komma att evalueras flera gånger − onödigt Programmering — tillämpningar och datastrukturer Steg1: Evaluera ålder+1 Steg2: Lägg värdet på anropsstacken (nytt värde, ny plats i minnet, ny referens till platsen) – Steg3: Lämna över kontrollen till metoden, tillsammans med en pekare till stacken (och värdet) Programmering — tillämpningar och datastrukturer – Par.passing Anrop: misse.sättÅlder(ålder+1); ArrayList Programmering — tillämpningar och datastrukturer Köra Java Call-by-value – Call-by-need – ArrayList 20 – Call-by-name – Arrayer Vid anrop: parametern ska bindas till argumentet (det aktuella värdet) Programmering — tillämpningar och datastrukturer – Par.passing Argument (aktuell parameter) vid anrop Arrayer Programmering — tillämpningar och datastrukturer Parameter (formell parameter) när en metod definieras Par.passing Arrayer ArrayList 23 22 Viktigt om CBV eller CBN… public static void admission(boolean highAchiever, int avgGrade) { if (highAchiever) { admitToMastersProgram(); } else { evaluate(avgGrade); ... } } public static void main(String[] args) { int[] results = new int[10]; … // register results topStudent = true; // Ger körfel om admission(topStudent, results[10]); det evalueras! } Programmering — tillämpningar och datastrukturer 24 4 Köra Java Bindning Par.passing Call-by-need Lat evaluering Fördröjd evaluering tills argumentet faktiskt används i metoden Evalueras en gång (till skillnad mot CBN) Bindning ArrayList Call-by-value – Par.passing Enkel Argumenten evalueras en gång före anrop Call-by-name – Värdet sätts på anropsstacken – Nästa gång bara att slå upp Jämförelse – Kan undvika vissa beräkningar – Arrayer Köra Java Arrayer – Kombinerar fördelarna med CBV och CBN Programmering — tillämpningar och datastrukturer ArrayList 25 Java Oändliga loopar Odefinierade operationer (div med 0) Ger ren semantik – bevisbar programkorrekthet Call-by-need Programmering — tillämpningar och datastrukturer Köra Java 26 Skillnad på det som skickas Bindning Java kör call-by-value Primitiv variabel (ex. int, double, boolean) Referens – Par.passing – Innehåller själva värdet Adress till ställe i datorns minne Arrayer ArrayList Programmering — tillämpningar och datastrukturer Köra Java Variabler i Java datorns RAM-minne Bindning int n Par.passing Arrayer String namn Programmering — tillämpningar och datastrukturer Köra Java Bindning Evaluering ger själva referensen – 3F02E3A1 123 – 3F02E3A2 3F02E3A5 CBV Par.passing 3F02E3A3 Arrayer 3F02E3A4 Kalle 3F02E3A6 Programmering — tillämpningar och datastrukturer 28 CBV i praktiken call-by-reference 3F02E3A0 3F02E3A5 ArrayList 27 Binds vid anrop till parametern Både anroparen och den som anropas refererar då till samma objekt OBS! Den som anropades kan förstöra för anroparen – Kan förändra objektet som de två referenserna pekar på ArrayList 29 Programmering — tillämpningar och datastrukturer 30 5 Köra Java Bindning Arrayer Samling av data int[] minaTelNummer = new int[30]; // allokering av tillräckligt // stort minnesutrymme Användbara datastrukturer Par.passing Element refereras genom indexering ringa = minaTelNummer[25]; Arrayer ArrayList // indexering Direktinitiering: int[] minaLottoNummer = {1 4 8 12 15}; // allok genom initiering Programmering — tillämpningar och datastrukturer Köra Java Arrayer Bindning Köra Java Bindning av typen int-array 32 Arrayer Snabb access Alla element tar lika stor plats Går att räkna ut var n:te elementet ligger från startpunkten – Datorn snabb på att ta fram data som ligger på en viss minnesadress, om man vet adressen – Par.passing int[] telNr new int[5]; plats för 5 element – Par.passing length-1 [0] [1] [2] [3] [4] Arrayer Arrayer ArrayList ArrayList Programmering — tillämpningar och datastrukturer Köra Java Bindning Objekt som innehåll public class Pingvin { int ålder; String namn; Par.passing Arrayer 33 Programmering — tillämpningar och datastrukturer 34 Köra Java Bindning Arrayer [0] [1] [2] [3] [4] Par.passing public Pingvin() { // konstruktor } Arrayer } ArrayList ArrayList Programmering — tillämpningar och datastrukturer Konstant åtkomsttid, oberoende av position i arrayen 35 Pingvin Pingvin Pingvin Pingvin Pingvin namn = ”a” namn = ”p” namn = ”a” namn = ”n” namn = ” ” andraPingvinensNamn = minArray[1].namn; Programmering — tillämpningar och datastrukturer 36 6 Köra Java Bindning Arrayer Kan ha array av vad som helst Bindning int[] tel new int[10]; Pingvin[] minaPingviner Pingvin[3]; Par.passing Arrayer Par.passing Om man har blandade element – Arrayer Test med instaceof och typomvandling ArrayList 37 Köra Java Arrayer MÅSTE allokera utrymme i förväg! String[] myStrings; … myStrings = new String[10]; Par.passing Arrayer Typomvandling (casting) Object[] minaElement = new Object[5]; minaElement[0] = bok; // initiering minaElement[1] = pelle; … if minaElement[0] instanceof Bok { Bok första = (Bok) minaElement[0]; första.bläddraTill(42); } ArrayList Programmering — tillämpningar och datastrukturer Bindning Köra Java pekar på null Programmering — tillämpningar och datastrukturer Köra Java Arrayer Bindning String[] myStrings; myStrings = new String[10]; … // fyll med inehåll myStringsBigger = new String[20]; // ny dubbel storlek System.arrayCopy(myStrings, 0, myStringsBigger, 0, 10); myStrings = myStringsBigger; Par.passing Vad händer om 10 element visar sig vara för litet? Arrayer ArrayList ArrayList Programmering — tillämpningar och datastrukturer Köra Java Bindning Par.passing 39 Array av arrayer double[][] matris = new double[3][5]; [0][0] … … … Köra Java Par.passing … Arrayer [2][0] 40 Array av arrayer Egentligen en array av objekt, av typen array matris matris[0] Arrayer [2][4] ArrayList ArrayList Programmering — tillämpningar och datastrukturer GC tar hand om gamla string-arrayen Programmering — tillämpningar och datastrukturer Bindning [0][4] 38 41 matris[1] matris[2] Programmering — tillämpningar och datastrukturer 42 7 Köra Java Bindning Par.passing ArrayList Fördefinierad datatyp i Java Baseras på arrays Bra om man vill Köra Java Bindning Par.passing Lägga till nya element – Men ändå kunna komma åt elementen i vilken ordning som helst – Arrayer Köra Java 43 ArrayList Vad man inte kan göra Ändra längden (kapaciteten) – Då slängs gamla ArrayList och en ny skapas Lägga in eller ta bort element utan att behöva flytta på andra element Programmering — tillämpningar och datastrukturer Köra Java Bindning ArrayList jobbar med Object Måste först slå in dem i en wrapper class – Par.passing – Kan inte lägga in primitiva datatyper Par.passing new Integer(42); Arrayer ArrayList 44 Användning ArrayList minaTal = new ArrayList(); int[] tal = {5, 7, 2, 15}; int i; for (i = 0; i < tal.length; i++) { minaTal.add(new Integer(tal[i])); } i = 0; while (i < minaTal.size()) { System.out.print(minaTal.get(i) + ", "); i++; } wrapper class ArrayList Programmering — tillämpningar och datastrukturer Köra Java 45 ArrayList Programmering — tillämpningar och datastrukturer Köra Java Bindning 46 ArrayList [0] [1] [2] Element Element Element Element Element Element Element data = ”k” data = ”l” data = ”l” data = ”k” data = ”l” data = ”l” data = ”e” Par.passing ArrayList Snabbare åtkomst än för listor Arrayer Bindning Arrayer Ger lite mer flexibilitet är arrays ArrayList Programmering — tillämpningar och datastrukturer Bindning – ArrayList Arrayer ArrayList [0] [1] [2] [3] Par.passing Arrayer minaBokstäver.add(new Element(”e”)); Programmering — tillämpningar och datastrukturer ArrayList 47 minaBokstäver.add(1, new Element(”a”)); Programmering — tillämpningar och datastrukturer 48 8 Köra Java Bindning ArrayList Bindning ArrayList [1] [2] [3] [4] Element Element Element Element Element [0] [1] [2] [3] [4] Element Element Element Element Element data = ”k” data = ”a” data = ”l” data = ”l” data = ”e” data = ”c” data = ”a” data = ”l” data = ”l” data = ”e” Par.passing Arrayer Element c = new Element(”c”); minaBokstäver.set(0, c); ArrayList Programmering — tillämpningar och datastrukturer Köra Java Bindning ArrayList [0] Par.passing Arrayer Köra Java 49 ArrayList [0] [1] [2] [3] Programmering — tillämpningar och datastrukturer Köra Java Bindning [4] minaBokstäver.indexOf(c); ⇒ 0 50 Några metoder i ArrayList Object get(int index) Object set(int index, Object o) Par.passing Arrayer Par.passing Element Element Element Element Element data = ”c” data = ”a” data = ”l” data = ”l” data = ”e” int size() boolean add(Object o) void add(int index, Object o) Arrayer indexOf(Object o) remove(int index) ArrayList minaBokstäver.indexOf(l); ⇒ 2 ArrayList Programmering — tillämpningar och datastrukturer Köra Java 51 Generiska datatyper Bindning Programmering — tillämpningar och datastrukturer Köra Java Bindning ArrayList Par.passing Par.passing ArrayList<Fågel> minaFåglar = new ArrayList<Fågel>(); // fill the list for (i = 0; i < minaFåglar.size(); i++) { Fågel f = minaFåglar.get(i); // no need to downcast Arrayer Arrayer ArrayList ArrayList 53 52 Generic types … ArrayList<Fågel> Programmering — tillämpningar och datastrukturer remove(Object o) } Without initialization: compiler error when trying to do add(); Programmering — tillämpningar och datastrukturer 54 9