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