Ö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