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