Denna föreläsning Historik: Java (Man brukar säga att) Java är

(Man brukar säga att) Java är...
• enkelt
Denna föreläsning
• “baserat på C/C++”
• Allmänt om Java
• objekt-orienterat “från början”
• Javas datatyper, arrayer, referenssemantik
• dynamiskt utbyggbart
• Klasser
• robust, säkert
• Strängar
• oberoende av hårdvaruarkitektur (portabelt)
• web-anpassat: applets, div bibliotek
Objectorienterad programmering
Sida 1
Java, grunder
Sven-Olof Nyström
Objectorienterad programmering
Java, grunder
Sida 3
Sven-Olof Nyström
Kompilering av Java
Historik: Java
• Hette från början OAK (James Gosling, 1991).
Utvecklades vid SUN Microsystems.
• Från början avsett för inbyggda system (tex
tvättmaskiner, mobiltelefoner, TV/video, spel, mm).
• Traditionella kompilatorer översätter programtexten
till maskinkod.
• De flesta Java-kompilatorer översätter till en slags
maskinkod; Javabytekod (JVM).
• (Storlek och pålitlighet var viktiga)
• Det finns inga maskiner som kör Javabytekod (nja,
nästan inga).
• Med WWW fick projektet en annan inriktning
• Därför måste JVM-koden vid körning antingen
• Java blev ett programspråk för web-applikationer
– översättas till maskinkod, eller
– interpreteras.
Objectorienterad programmering
Sida 2
Objectorienterad programmering
Sida 4
Utvecklingsverktyg för Java
Verktyg
• Senaste versioner är
Arbetsgången är:
– J2SE 1.4.2 samt
• man redigerar sina filer (klasser) med något
redigeringsverktyg (tex Emacs),
– J2SE 5.0
• J2SE 5.0 (även känt som Java 1.5) innehåller viktiga
utökningar, inte helt bakåtkompatibelt.
• kör den med java (applikationer) eller appletviewer.
• Vi fokuserar på Java 5.
Objectorienterad programmering
Java, grunder
• kompilerar dem med javac och
Sida 5
Sven-Olof Nyström
Objectorienterad programmering
Sida 7
Java, grunder
Sven-Olof Nyström
Verktyg (forts)
On-line dokumentation
• Applets kan också visas i webbläsare som t.ex.
Explorer, Netscape eller Mozilla.
• När man arbetar med Java behöver man
dokumentation av alla standardklasser.
• Kompilator, interpretator och appletviewer startas
– från ett terminalfönster (Unix) eller
http://java.sun.com/j2se/1.5.0/docs/api
– från ett MS-DOS-fönster (Windows).
• Suns tutorial
• Om filen heter MinTest.java skriver man alltså:
http://java.sun.com/docs/books/tutorial
javac MinTest.java
java MinTest
Objectorienterad programmering
Sida 6
Objectorienterad programmering
Sida 8
Ett första exempel
Datatyper i Java: Tre slag
• Klassen Hej implementerar ett klassiskt exempel: en
applikation som skriver ut ett meddelande.
• Filen ska heta Hej.java, samma namn som klassen
• public class Hej {
public static void main(String[] args) {
System.out.println("Hej hopp");
}
}
Objectorienterad programmering
Java, grunder
• Primitiva: Sanningsvärden, tecken, heltal, flyttal (8
stycken)
• Arrayer (nästan inte alls som i C)
• Objekt
Sida 9
Sven-Olof Nyström
Objectorienterad programmering
Sida 11
Java, grunder
Sven-Olof Nyström
De åtta primitiva typerna
Enkelt exempel (testkörning–Unix)
harpo$ javac Hej.java
harpo$ java Hej
Hej hopp
harpo$
harpo$ java -Djava.compiler=NONE Hej
Hej hopp
Objectorienterad programmering
Sida 10
Typ
Innehåll
Defaultvärde
Storlek
boolean
char
byte
short
int
long
float
double
true, false
Tecken
Heltal
Heltal
Heltal
Heltal
Flyttal
Flyttal
false
\u000
0
0
0
0
0.0
0.0
1 bit
16 bit
8 bit
16 bit
32 bit
64 bit
32 bit
64 bit
Objectorienterad programmering
Sida 12
Typkonvertering heltal & flyttal
Typen boolean
• Ett tal kan automatiskt omvandlas till ett tal av en
vidare representation.
1. representerar ett sanningsvärde
(Exempel: int->long, int->double, float->double)
2. genereras av relationsoperatorer
(tex ==, <)
• Ett heltal kan omvandlas till en mindre representation
via en uttrycklig omvandling,
3. if och while-satser kräver att alla sanningsvärden
representeras som boolean
• Aritmetiska operatorer (tex +) returnerar alltid ett
värde av type int eller long.
b = b + 1 är ej korrekt om b är en byte.
Objectorienterad programmering
Sida 13
Java, grunder
Sven-Olof Nyström
Objectorienterad programmering
Java, grunder
Sida 15
Sven-Olof Nyström
Arrayer i Java: Inte som i C
• arrayer skapas explicit
Typen char
• storlek anges dynamiskt
• index testas
Ett tecken i Unicode.
int[] a = new int [10];
16 bitar.
a[-1] och a[10] ger felmeddelande!
Unicode omfattar alla levande och utdöda språk.
• inititiering
Hur får dessa plats i 16 bitar?
int[] a = {1, 2, 3};
men även
int[] a = {1, n+1, 2*n, n*n};
Objectorienterad programmering
Sida 14
Objectorienterad programmering
Sida 16
Exempel: Byt värde på två array-variabler
Inte som i C (forts)
static void main (String args[]) {
int[] a = {1,2,3};
int[] b = {99, 98, 97, 93, 92, 91};
int[] temp;
• Tilldelning
int[] a = new int [10]; int[] b = a;
a och b refererar till samma array!
• Storlek på array ges av .length.
int[] a = new int[10];
int x = a.length;
temp = a;
a = b;
b = temp;
a = new int[100];
int y = a.length;
System.out.println("b[0] = " + b[0]);
}
Objectorienterad programmering
Java, grunder
Sida 17
Sven-Olof Nyström
Objectorienterad programmering
Java, grunder
Sida 19
Sven-Olof Nyström
Lite om strängar
• I Java är strängar objekt av en speciell klass “String”;
inte en primitiv datatyp och inte heller en array.
Inte som i C (forts)
• Tecknen i en sträng är av “char”-typ, dvs
Unicode-tecken.
• “null” står för ingen array.
int[] a = null;
• Objekt av typ String är konstanta—man kan inte
ändra i en sträng. (Det finns en klass StringBuffer
som tillåter ändringar.)
betyder samma sak som
int[] a;
• Man kan skapa ett nytt sträng-objekt med syntaxen
"En sträng".
Objectorienterad programmering
Sida 18
Objectorienterad programmering
Sida 20
Strängar (forts)
Vad är en klass?
• Strängar slås ihop (konkateneras) med “+”.
Om a och b är strängar så returnerar uttrycket
a+b
en ny sträng som är konkateneringen av a och b.
• Om det ena argumentet till + är ett String-objekt, så
omvandlas det andra till en sträng.
• Exempel:
int x = 42;
System.out.println("Shoesize: " + x);
Java, grunder
• En klassdefinition innehåller datafält ...
• ... och metoder (= “funktioner” i C).
• Man kan också säga: En klassdefinition beskriver
kod och data.
• Ett Javaprogram består av en eller flera
klassdefinitioner (och ingenting kan finnas utanför en
klassdefinition).
Resultat: “Shoesize: 42”.
Objectorienterad programmering
• En klass är ett sätt att beskriva en mängd objekt och
deras gemensamma egenskaper.
Sida 21
Sven-Olof Nyström
Objectorienterad programmering
Java, grunder
Sida 23
Sven-Olof Nyström
Strängar, jämförelse
Klasser och objekt
• Notera att två strängar kan ha samma innehåll utan
att vara identiska.
• Varje objekt tillhör en viss klass. (Objektets klass är
detsamma som objektets typ.)
• Operatorn == testar om två referenser är till samma
objekt.
• Vi säger att objektet är en instans av klassen.
• För att testa om två strängar har samma innehåll,
skriv (tex)
s1.equals(s2)
Objectorienterad programmering
Sida 22
• Alla objekt av en viss klass kan användas på samma
sätt–de har samma “gränssnitt”.
• En definition av en viss klass kan ses som en mall för
objekt av den typen.
Objectorienterad programmering
Sida 24
Klassdefinition: Exempel
Referensvariabler och referenssemantik
class Person {
int ålder;
String namn;
}
Person x;
Person y;
• Konvention: Namnet på en klass skrivs med stor
bokstav.
• ’namn’ och ’ålder’ är fält i objekt av typen Person.
• Skansholm: instansvariabler
x.ålder = 42;
x.namn = "Kalle Karlsson";
Vilken ålder har y?
• Engelska: field
Objectorienterad programmering
Java, grunder
x = new Person ();
y = x;
Sida 25
Sven-Olof Nyström
Objectorienterad programmering
Java, grunder
Sida 27
Sven-Olof Nyström
Klassdefinition: Körexempel
Referensvariabler och
referenssemantik(forts)
Person x;
x = new Person ();
• Givet en klassdefinition
x.ålder = 42;
x.namn = "Kalle Karlsson";
class X { ... }
• och en variabeldeklaration
X a;
System.out.println(
"Personen " + x.namn + " är " + x.ålder
+ " år gammal");
Objectorienterad programmering
• Variabeln a lagrar en referens.
Sida 26
Objectorienterad programmering
Sida 28
Metoder
public class Person {
int age;
Referensvariabler (forts)
• Exempel:
void incrementAge() {
age = age + 1;
}
X a, b;
a = new X();
b = a;
}
• Nu refererar a och b till samma objekt.
En klassdefinition även innehålla definitioner av metoder.
Liknar funktioner i C, men en metod kan referera till
objektets instansvariabler.
Objectorienterad programmering
Java, grunder
Sida 29
Sven-Olof Nyström
Objectorienterad programmering
Java, grunder
Sida 31
Sven-Olof Nyström
Referensvariabler i metodanrop
• Med en metoddefinition
Referensvariabel, regel
void f(X c) { ... }
• Variabler av klasstyp har referenssemantik.
och ett anrop
f(a)
• Nya objekt skapas med new.
• Tilldelning kopierar referensen, inte objektet.
kommer variabeln c inom metodkroppen att referera
till samma objekt som a
• Regel: Objekt kopieras aldrig (om man inte ber
uttryckligen om det).
Objectorienterad programmering
Sida 30
Objectorienterad programmering
Sida 32
Konstruktorer: Att skapa nya objekt
Namns räckvidd
• Instansvariabler och metoder kan kommas åt direkt
inom hela den egna klassen
Exempel:
class Person {
[...]
Person (String n, int å) {
ålder = å;
namn = n;
}
}
• Namn på lokala variabler inom ett block (metodkropp)
kan bara kommas åt inom blocket (metodkroppen).
• Om samma namn används för flera olika saker gäller
den användning som är "närmast".
• Instansvariabler och metoder kan alltid kommas åt
med this:
Skapa en ny person:
this.namn ger instansvariabeln i nuvarande klassen
även om namn har andra betydelser.
Person x = new Person("Kalle", 42);
Objectorienterad programmering
Java, grunder
Sida 33
Sven-Olof Nyström
Objectorienterad programmering
Java, grunder
Sven-Olof Nyström
Referenssemantik, repetition
Konstruktorer (forts)
• En konstruktor har alltid samma namn som klassen
• En konstruktor deklareras utan resultattyp (inte ens
void)
• En konstruktor ska initialisera objektets fält
(instansvariabler)
• Om en klass inte har någon konstruktor, kommer
Javakompilatorn att definiera en parameterlös
konstruktor (defaultkonstruktorn)
Objectorienterad programmering
Sida 35
Sida 34
Vad händer om. . .
• man tilldelar två variabler samma objekt?
K x = new K();
K y = x;
• passar ett objekt som parameter?
void m(K x) { ... }
K y = new K();
m(y);
Objectorienterad programmering
Sida 36
Referenssemantik (forts)
• en metod returnerar ett objekt?
K m() {
K x = new K();
return x;
}
• om variabeln redan är bunden?
K x = new K();
K y = new K();
y = x;
Objectorienterad programmering
Sida 37