Denna föreläsning
• Allmänt om Java
• Javas datatyper, arrayer, referenssemantik
• Klasser
• Strängar
Objectorienterad programmering
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,
• (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
Kompilering av Java
• Traditionella kompilatorer översätter programte till maskinkod.
• De flesta Java-kompilatorer översätter till en maskinkod; Javabytekod (JVM).
• Det finns inga maskiner som kör Javabytek 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 utökningar, inte helt bakåtkompatibelt.
• Vi fokuserar på Java 5.
Objectorienterad programmering
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 appletvie
Objectorienterad programmering
Verktyg (forts)
• Applets kan också visas i webbläsare som Explorer, Netscape eller Mozilla.
• Kompilator, interpretator och appletviewer star – 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:
applikation som skriver ut ett meddelande.
• Filen ska heta Hej.java, samma namn som
• public class Hej {
public static void main(String[] args) { System.out.println("Hej hopp");
} }
Objectorienterad programmering
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 stycken)
• Arrayer (nästan inte alls som i C)
• Objekt
Objectorienterad programmering Sida
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
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 vidare representation.
(Exempel: int->long, int->double, float->doub
• Ett heltal kan omvandlas till en mindre representation via en uttrycklig omvandling,
• Aritmetiska operatorer (tex +) returnerar alltid värde av type int eller long.
b = b + 1 är ej korrekt om b är en byte.
Objectorienterad programmering Sida
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
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-variab
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
Lite om strängar
• I Java är strängar objekt av en speciell klass inte en primitiv datatyp och inte heller en arr
• Tecknen i en sträng är av “char”-typ, dvs Unicode-tecken.
• Objekt av typ String är konstanta—man kan
ändra i en sträng. (Det finns en klass StringBuff som tillåter ändringar.)
• Man kan skapa ett nytt sträng-objekt med syntax
"En sträng".
Strängar (forts)
• Strängar slås ihop (konkateneras) med “+”.
Om a och b är strängar så returnerar uttryc a + b
en ny sträng som är konkateneringen av a
• Om det ena argumentet till + är ett String-objekt, omvandlas det andra till en sträng.
• Exempel:
int x = 42;
System.out.println("Shoesize: " + x);
Resultat: “Shoesize: 42”.
Objectorienterad programmering Sida
Strängar, jämförelse
• Notera att två strängar kan ha samma innehåll att vara identiska.
• Operatorn == testar om två referenser är till 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 deras gemensamma egenskaper.
• En klassdefinition innehåller datafält ...
• ... och metoder (= “funktioner” i C).
• Man kan också säga: En klassdefinition beskr kod och data.
• Ett Javaprogram består av en eller flera klassdefinitioner (och ingenting kan finnas klassdefinition).
Objectorienterad programmering Sida
Klasser och objekt
• Varje objekt tillhör en viss klass. (Objektets detsamma som objektets typ.)
• Vi säger att objektet är en instans av klassen.
• Alla objekt av en viss klass kan användas på sätt–de har samma “gränssnitt”.
• En definition av en viss klass kan ses som objekt av den typen.
Klassdefinition: Exempel class Person {
int ålder;
String namn;
}
• Konvention: Namnet på en klass skrivs med bokstav.
• ’namn’ och ’ålder’ är fält i objekt av typen P
• Skansholm: instansvariabler
• Engelska: field
Objectorienterad programmering Sida
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
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
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 Liknar funktioner i C, men en metod kan referer objektets instansvariabler.
Objectorienterad programmering Sida
Referensvariabler i metodanrop
• Med en metoddefinition void f(X c) { ... }
och ett anrop f(a)
kommer variabeln c inom metodkroppen att till samma objekt som a
• Regel: Objekt kopieras aldrig (om man inte 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
Konstruktorer (forts)
• En konstruktor har alltid samma namn som
• En konstruktor deklareras utan resultattyp (inte void)
• En konstruktor ska initialisera objektets fält (instansvariabler)
• Om en klass inte har någon konstruktor, kommer Javakompilatorn att definiera en parameter
konstruktor (defaultkonstruktorn)
Namns räckvidd
• Instansvariabler och metoder kan kommas 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 sak den användning som är "närmast".
• Instansvariabler och metoder kan alltid kommas med this:
this.namn ger instansvariabeln i nuvarande även om namn har andra betydelser.
Objectorienterad programmering Sida
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