(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