Föreläsning 2
Täcker material från lektion 1-4
 DrJava
 Variabler och Datatyper
 Aritmetik
 Tecken och strängar
 Klasser, Objekt
 Metoder
 Villkor och iterationer
 main-metoden
 programmeringsstil
 Debugging
Fö2
1. Grundläggande begrepp
2. Objekt och metoder
3. If, while, main
4. Objekt och metoder OU1
Föreläsningen
kommer ta
upp valda
delar av detta
1
Java…
När java installeras på datorn hamnar bl.a
följande där:
• Javakompilatorn
• Javainterpretatorn
• En massa färdiga javaprogram, sk. klasser som
hör till språket Java, t.ex. Math, String
Fö2
2
Vad är DrJava?
• DrJava är ett (gratis)program för
att programmera i Java
– Utvecklat vid Rice University,
USA
– DrJava är skrivet i Java
• Program för att programmera i
kallas för IDE= Integrated
Development Environment
Compile
Run
• Med DrJava kan man
– Skapa Javaprogram
(definitions pane)
– Testa enstaka javasatser
(interactions pane)
– Lista alla öppna filer (files
pane)
Fö2
3
Compile? Run?
• Javasatserna i ett program kallas även för källkoden och
den sparas i en javafil (har efternamnet .java)
• Med Compile går kompilatorn igenom javafilen och
kontrollerar om javasatserna är språkligt riktiga
(syntaxkontroll)
• Om ok, översätter kompilatorn javasatserna till en annan
kod som datorn kan köra (exekvera)  classfilen skapas
• Med Run går den s.k. javainterpretatorn igenom classfilen
och utför de instruktioner som finns där, dvs programmet
körs (exekveras)
• När vi använder DrJava, finns det tre filer som är
associerade till det program vi skriver: .java, .java~, .class
(vi kikar på exempel på de tre filerna i programmet TestTurtle)
Fö2
4
DrJava – färgkodning av javasatserna underlättar
• I Definition Pane färgkodas satserna på lite olika sätt
• Detta indikerar huruvida javasatserna tolkas som
korrekta
• Det finns även en del andra handgrepp man kan
utföra i Definitions Pane
IndentLines, Uncomment, lokalisera matchande
måsvingar, etc
• Läraren visar exempel på ovan (programmet
TestTurles som
flyttar två paddor i varsin cirkelbåge)
•
Bra tips: Numrering av javasatser kan göras i Edit>Preferences>Display Options
Fö2
5
Java…
• Språket har strikta regler för hur det skall skrivas, dvs språkets
grammatik, det kallas språkets syntax.
• Språket byggs upp av identifierare och reserverade ord som
sätts ihop till satser.
• Identifierare är det som programmeraren själv hittar på namn
för, t.ex. variabelnamn
• Reserverade ord är de ord som finns inbyggda i språket.
• En sats är en instruktion. En sådan avslutas normalt med ett
semikolon
Fö2
6
Reserverade ord i språket Java
abstract
assert
boolean
break
byte
case
catch
char
class
const
continue
default
do
double
else
enum
extends
false
final
finally
float
for
goto
if
implements
import
instanceof
int
interface
long
native
new
null
package
private
protected
public
return
short
static
strictfp
super
switch
synchronized
this
throw
throws
transient
true
try
void
volatile
while
Ord i fet stil används i kursen
Fö2
7
Deklarera variabel
Alla variabler som skall användas i ett program måste
deklareras, dvs
• måste få ett namn
och
• måste ange vilken sorts variabel det är, dvs
ange datatypen
Fö2
8
Datatyper
primitiv datatyp (exvis int, double)
eller
objekttyp (exvis Turtle, World)
•
Primitiva typerna är inbyggda i javaspråket
•
Objekttyper kan vi definiera själva (Turtle)
•
Vid deklarationen reserveras ett minnesutrymme i
datorn för variabelns värde.
•
Variabelns namn är ett slags alias för adressen till
minnesutrymme
Fö2
9
Datorns minne – en enorm byrålåda
Vi kan betrakta minnet som en byrå med gigantisk
många byrålådor där information kan lagras.
När ett javaprogram startas får
det tillgång till en del av
byrålådan för att lagra sina
variabler.
När en variabel deklareras i programmet reserveras en
byrålåda för variabelns värde. Bra om variabelns namn
associerar till vilken information som finns i lådan, det blir då
enklare att veta i programmet vad vi använder variabeln till.
Variabelns namn blir ett alias för adressen till byrålådan.
Del 2: Intro till variabler i Java
10
Exempel: Vi deklarerar och initierar variabler
som är s.k. primitiva datatyper:
int antal=67;
double x=2.5;
char c='A';
boolean hungrig=true;
x
hungrig
antal
c
Fö2
11
Åtta primitiva datatyper
• Fyra heltalstyper (numeriska):
byte, short, int, long
• Två flyttalstyper (numeriska)
Finns signed och
unsigned heltalstyper,
dvs tal med +/- eller bara
+.
float, double
• En teckentyp:
char
• En boolskt typ (sant eller falskt):
boolean
Fö2
12
De numeriska datatyper
Typ
Minnesutrymme Min/Maxvärde
byte
8 bit
-128 … 127
short
16
-32768 … 32767
int
32
-2147483648 …
2147483647
long
64
+/- 9 x 1018
float
32
double
64
+/- 3.4 x 1038,
7 siffrors nogr.
+/- 1.7 x 10308,
15 siffrors nogr.
Fö2
13
Tecken
• En char-variabel lagrar ett enstaka tecken i två byte
(speciellt för Java).
• Tecknet kodas först till ett heltal innan det lagras i
minnet.
• Koden är unicode, se
http://www.tamasoft.co.jp/en/general-info/unicode.html.
Koden för de vanligaste tecknen finns på ASCII Code The extended ASCII table
• Två byte innebär ett minnesutrymme som kan ha
värden 0-65536, dvs det finns en kapacitet för 65536
tecken.
• Drygt 30000 tecken finns f.n. kodade.
Fö2
14
Primitiva datatyperna
byte
8 bits
short
8 bits
8 bits
int
8 bits
8 bits
8 bits
8 bits
long
8 bits
8 bits
8 bits
8 bits
float
8 bits
8 bits
8 bits
8 bits
double
8 bits
8 bits
8 bits
8 bits
char
8 bits
8 bits
Fö2
8 bits
8 bits
8 bits
8 bits
8 bits
8 bits
8 bits
8 bits
15
Aritmetik
+, -, *, /
för addition, subtraktion, multiplikation och division
Division med heltal är speciellt
++, -för addition med ett resp subtraktion med ett
int i=0;
i++;
i blir ett
%
för restberäkning, modulo
int z=16;
Förklaring, resten av 16 delat med 10:
int w=z%10;  w blir 6
16/10 = 1 + 6/10
Heltalsdivision
int x=5/4;
int a=14;
int b=a/3;
 x blir 1
 b blir 2
Fö2
16
Typomvandling
Konvertera från en datatyp till en annan datatyp
• Heltal  Flyttal
per auto, eller med (double) (…)
• Flyttal  Heltal
– (int) (…) ger trunkering
•
•
•
•
•
Char  Heltal: (int) (…)
Heltal  Char: (char) (…)
Flyttal  String: Double.toString(…)
String  Flyttal: Double.parseDouble(…)
String  Heltal finns motsvarande…
Fö2
17
Övning
Frågor
(http://www.it.uu.se/edu/course/homepage/prog1/ht16/talks/t02/test1.html)
Fö2
18
Varför (1) deklarera och (2) ha många
datatyper?
1. ”Säkerhet”: Bara använda variabler som är
deklarerade
Ex. stavfel: x1=4; x1=xl+8;
versaler/gemener: X=x+X;
2. Värden man vill räkna med är av olika sorter
–
–
–
–
–
Bra då att ha variabler som matchar dessa.
Minnesutrymmet anpassas till värdena.
Beräkningarna anpassas till datatypen.
Snabbare beräkningar.
”Ordning och reda”
Fö2
19
Klasser och objekttyper
 Klassen String: representerar textsträngar. Inbyggd i
själva javaspråket
 Klassen Math: samlar matematiska funktioner (i vid
mening). Alltid tillgänglig.
 Klasserna World och Turtle: Definieras i programvara
som finns för denna kurs.
Fö2
20
Klassen Math
Klassen Math används för att samla ihop matematiska
funktioner och konstanter (man gör aldrig new Math)
Funktionerna (metoderna) anropas via klassnamnet.
Exempel:
Math.exp(3.5)
Math.pow( Math.sin(2.5),2)
Math.PI + Math.sinh(x/2)
Se Javadokumentationen av klassen Math
(http://docs.oracle.com/javase/7/docs/api/java/lang/Math.html)
Fö2
21
Klasserna World och Turtle
Klasserna World och Turtle gör man vanligen objekt av.
Objekt skapas med operatorn new.
Exempel:
World w = new World(400,400);
Turtle t1 = new Turtle(w);
Turtle t2 = new Turtle(w);
Variablerna w, t1 och t2 håller reda på de skapade
objekten (”referenser", ”pekare”).
Vi kan ”be” objekten om olika saker genom att anropa metoder.
Exempel:
t1.turn(90);
t2.move(20);
Fö2
22
Metoder
Vi anropar metoder för att få reda på egenskaper
(information) hos objekten.
Exempel:
int dx = t1.getXPos() – t2.getXPos();
Vi anropar också metoder för att beordra objekten att utföra
saker och ändra egenskaperna.
Exempel:
t1.move(20);
Observera skillnaden mot när vi anropar metoder (funktioner)
i klassen Math.
Fö2
23
Parametrar
Ibland vill man skicka information till metoden. För detta
används parametrar.
Exempel:
t1.move(100);
t1.turn(45);
t2.turnTo(0,0);
t1.turnTo(t2);
Av anropen framgår dels vilket objekt som skall påverkas och
dels eventuell information som skickas till metoden — de
aktuella parametrarna
Frågor:
t1.move( (int)(Math.random()*100) ); Är det OK?
t1.turnTo(0,0) och t1.turnTo(t2); Är det OK?
Fö2
24
Summering av metoder i klassen Turtle
Vi har sett i lektion 2
move(int n)
turn(int n)
turnTo(int x, int y)
turnTo(Turtle t)
disablePath()
enablePath ()
setDirection(int d)
Flytta n pixlar framåt
Rotera n grader
Sätt rikningen mot pkt (x,y), pixelkoordinat
Sätt riktningen mot paddan t
Visa ej spåret
Visa spåret
Sätt ny riktning d
I lektion 3:
getXpos(),getYpos()
Returnera xpos resp ypos
distanceTo(int x,int y) Returnera avståndet till x,y
getDirection()
Returnera riktningen
moveTo(int x, int y)
Flytta till pixelkoordinat x,y
Frågor
(http://www.it.uu.se/edu/course/homepage/prog1/ht16/talks/f02/test2.html)
Fö2
25
Skriva egna metoder
Exempel:
/**
* Draws a equilateral triangle with a specified size
*/
public void drawTriangle(int side) {
this.move(side);
this.turn(120);
this.move(side);
this.turn(120);
this.move(side);
}
Metoder har
 en synlighet — i detta fall public
 en returtyp — i detta fall void som anger att inget värde
returneras
 0 eller flera formella parametrar — i detta fall en av typ int
Fö2
26
Metoder
 Metoder måste alltid placeras i en klass
 I DrJava har man den klass som man vill redigera i synlig
definitionsrutan
 En metod kan innehålla lokala variabler. Existerar bara i
metoden och ”glöms bort” när man lämnar metoden.
 Om man ändrat ett program, måste man alltid kompilera
det innan programmet kan köras.
Fö2
27
Strängar samt utmatning i
terminalfönster/konsolen/Interactions
Generellt sätt att få se resultat från ett program. Exempel:
String namn="Torsten";
System.out.print("Välkommen ");
System.out.print(namn);
System.out.print('!');
System.out.println();
Kortare:
String namn="Torsten";
System.out.println("Välkommen " + namn + '!');
Observera: println får en sträng som parameter. Den bildat
genom konkatenering (hopslagning) som utförs med +operatorn
Frågor
(http://www.it.uu.se/edu/course/homepage/prog1/ht16/talks/t02/test3.html)
Fö2
28
Algoritmer
En algoritm är en följd av väldefinierade instruktioner för hur
en uppgift skall lösas.
Exempel på algoritm: metoden drawTriangle.
Fö2
29
Algoritmformuleringar
Det finns följande generella sätt att formulera algoritmer med
hjälp av de tillgängliga instruktionerna:
 sekvens — utför en följd av instruktioner i tur och ordning
 selektion — välj mellan olika alternativa sekvenser
 iteration — upprepa en sekvens ett antal gånger
 abstraktion — sätt ihop en algoritm enl ovanstående
punkter och ge hopsättningen ett namn
Fö2
30
Selektion: if-satsen
Generellt
if ( villkor ) {
satser
}
Exempel:
// Compute the maximum of x and y
double max = x;
if (y > x) {
max = y;
}
Frågor
(http://www.it.uu.se/edu/course/homepage/prog1/ht16/talks/t02/test4.html)
Fö2
31
Selektion: if-satsen forts
Generellt
if (villkor) {
satser
} else {
satser
}
Exempel:
//Compute the roots to x*x +p*x + q = 0
double d = (p*p-4*q)/4;
if (d < 0) {
System.out.println("Complex roots");
}
else {
d = Math.sqrt(d);
double x1 = -p/2 + d;
double x2 = -p/2 - d;
System.out.println("x1:" + x1);
System.out.println("x2:" + x2);
}
Satserna i grenarna är godtyckliga satser — t ex if-satser
Fö2
32
Iterationer
I java finns det tre konstruktioner för upprepning av kod:
while, for och do.
Här tar vi upp while-satsen
Generellt
while ( villkor) {
satser
}
Exempel:
// Compute x raised to 10
int i = 1;
double p = 1;
while (i <= 10) {
p = p*x;
i++;
}
Kan även lösas med
Math.pow(x,10);
Fö2
33
main-metoden
Vill skapa en värld med några paddor och låta de gå omkring
på något sätt dvs lite new, några move, turn, . . .
Var skall jag skriva detta?
Två möjligheter:
 i interaktionsrutan i DrJava eller
 i en metod
Interaktionsrutan passar bra för att skriva enskilda uttryck
men besvärligare när det blir många uttryck och satser.
Dessutom: finns bara i DrJava.
Alltså: i en metod!….
Fö2
34
main-metoden
Var skall metoden placeras?
Måste vara i en klass!
Klassen Turtle?
Objekt ur klassen Turtle representerar en padda. Onaturligt med en
”vanlig” objektmetod skapar båda världar och paddor:
t1.doSomething();
men då måste ju objektet t1 existera…
Alternativet är då att skriva en mainmetod. En sådan metod anropas
genom att ange klassens namn. En metod som man anropar genom att
ange klassens namn kallas
klassmetod, vilket i java anges med ordet static
Vi studerar två alternativ:
• Skriva en mainmetod i klassen Turtle
• Skriva en ny klass t ex kallad TestTurtles med en mainmetod.
Fö2
35
main-metoden i klassen Turtle
Den metoden är en klassmetod som hör till klassen som
helhet, inte till enskilda objekt. Anges som static i
metodhuvudet. Exempel:
public class Turtle {
....
public static void main(String[] args) {
World w = new World(500,500);
Turtle t1 = new Turtle(w);
Turtle t2 = new Turtle(w);
int distance = 30;
int rotation = 15;
int loopNr = 1;
while (loopNr<20) {
t1.move(distance);
t1.turn(rotation);
t2.move(distance);
t2.turn(-rotation);
loopNr++;
loopNr++;
} // while
} // main
} // class
Fö2
36
main-metod i en annan klass
public class TestTurtles {
public static void main(String[] args) {
World w = new World(500,500);
Turtle t1 = new Turtle(w);
Turtle t2 = new Turtle(w);
World w = new World(500,500);
Turtle t1 = new Turtle(w);
Turtle t2 = new Turtle(w);
int distance = 30;
int rotation = 15;
int loopNr = 1;
while (loopNr<20) {
t1.move(distance);
t1.turn(rotation);
t2.move(distance);
t2.turn(-rotation);
loopNr++;
} // while
} // main
} // class
Vi testkör
programmet
Klassen innehåller en enda metod — main-metoden
Det är alltid den aktuella klassens main-metod som körs vid Run
Fö2
37
Tidsfördröjning
Om man vill se vad som händer i varje steg kan man lägga in en
tidsfördröjning i loopen:
public class TestTurtles {
public static void main(String[] args) throws InterruptedException {
World w = new World(500,500);
Turtle t1 = new Turtle(w);
Turtle t2 = new Turtle(w);
int i = 1;
while (i<20) {
t1.move(30);
t1.turn(-15);
t2.move(30);
t2.turn(15);
i++;
Thread.sleep(200); // ”Sov” 200 ms
} // while
}
}
Notera att throws Interrupted Exception är nödvändig för Thread.sleep
Vi testkör programmet
Fö2
38
Kodstandard: Namngivning
 Namn på metoder, variabler, klasser mm skall vara vettiga!
 Metoder och variabler skall ha liten begynnelsebokstav!
 Klassnamn skall ha stor begynnelsebokstav!
 Använd stor bokstav (eller understrykningstecken) för att
öka läsbarheten i långa namn (Ex: numberOfTurtles)
 Namngivna konstanter skrivs med stora bokstäver (Ex:
Math.PI)
Fö2
39
Kodstandard - layout
 Indentera raderna systematiskt och enhetligt.
Tips: Select All följt av Indent All Lines fixar hela filen
 Skriv alltid ny sats på ny rad!
 Skriv inte längre rader än 80 tecken - bryt på vettiga
ställen!
 Kommatecken skall alltid följas av blanktecken
 Omge alltid operatorer med låg prioritet med blanktecken
Fö2
40
Kodstandard: layout
Placering av klammertecknen (måsvingarna)
Antingen
Eller
if (x < y) {
...
} else if (y == y){
...
} else {
...
}
if (x < y)
{
...
}
else if (y == y)
{
...
}
else
{
...
}
Varför kodstandard?
Jo, ger läsbarhet!
Fö2
41
Kodkommentarer
Viktigt, men
 Kommentera inte det som är uppenbart från koden!
Förutsätt att den som läser koden kan Java.
 Se till att kommentarerna inte skymmer koden
 Felaktiga kommentarer är värre än inga kommentarer!
 Bra namngivning, struktur och layout gör att koden behöver
ett minimum av kommentarer
 Försök inte förklara dåligt skriven kod med kommentarer —
skriv om koden!
Fö2
42
Kodkommentarer: Javadoc
Det finns en särskild typ av kommentarer —
s k javadoc-kommentarer som
används för att automatiskt generera dokumentationssidor.
Se kommentarerna i klassen Turtle för exempel!
Dokumentation av Turtle
(http://www.it.uu.se/edu/course/homepage/prog1/commonFiles/new_turtleWorld/doc)
Fö2
43
Kodstandard och programmeringstil
Läs på sidan kodningsregler på kurshemsidan
Fö2
44
Debugging
 Vi testar DrJava’s debugger med programmet
TestTurtles
Fö2
45