(Man brukar säga att) Java är... Denna föreläsning Allmänt om Java Javas datatyper, arrayer, referenssemantik Klasser Strängar 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 1 Objectorienterad programmering Sida 3 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 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. Objectorienterad programmering Sida 2 Objectorienterad programmering Sida 4
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. Arbetsgången är: Verktyg 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 5 Objectorienterad programmering Sida 7 Verktyg (forts) 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 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 Objectorienterad programmering Sida 6 Objectorienterad programmering Sida 8
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"); 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 9 Objectorienterad programmering Sida 11 Enkelt exempel (testkörning Unix) De åtta primitiva typerna Typ Innehåll Defaultvärde Storlek harpo$ javac Hej.java harpo$ java Hej Hej hopp harpo$ harpo$ java -Djava.compiler=NONE Hej Hej hopp 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 Objectorienterad programmering Sida 10 Objectorienterad programmering Sida 12
Typkonvertering heltal & flyttal 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 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 13 Objectorienterad programmering Sida 15 Arrayer i Java: Inte som i C 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? 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; Objectorienterad programmering Sida 14 Objectorienterad programmering Sida 16
Tilldelning Inte som i C (forts) 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; 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; a = new int[100]; int y = a.length; System.out.println("b[0] = " + b[0]); Objectorienterad programmering Sida 17 Objectorienterad programmering Sida 19 Lite om strängar Inte som i C (forts) null står för ingen array. int[] a = null; betyder samma sak som int[] a; 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". Objectorienterad programmering Sida 18 Objectorienterad programmering Sida 20
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. 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 21 Objectorienterad programmering Sida 23 Strängar, jämförelse Klasser och objekt 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) 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. Objectorienterad programmering Sida 22 Objectorienterad programmering Sida 24
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 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 25 Objectorienterad programmering Sida 27 Person x; x = new Person (); Klassdefinition: Körexempel x.ålder = 42; x.namn = "Kalle Karlsson"; System.out.println( "Personen " + x.namn + " är " + x.ålder + " år gammal"); Referensvariabler och referenssemantik(forts) Givet en klassdefinition class X {... och en variabeldeklaration X a; Variabeln a lagrar en referens. Objectorienterad programmering Sida 26 Objectorienterad programmering Sida 28
Metoder Exempel: X a, b; a = new X(); b = a; Referensvariabler (forts) Nu refererar a och b till samma objekt. 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 29 Objectorienterad programmering Sida 31 Referensvariabler i metodanrop Referensvariabel, regel Variabler av klasstyp har referenssemantik. Nya objekt skapas med new. Tilldelning kopierar referensen, inte objektet. 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). Objectorienterad programmering Sida 30 Objectorienterad programmering Sida 32
Exempel: Konstruktorer: Att skapa nya objekt class Person { [...] Person (String n, int å) { ålder = å; namn = n; Skapa en ny person: Person x = new Person("Kalle", 42); 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 33 Objectorienterad programmering Sida 35 Konstruktorer (forts) Referenssemantik, repetition 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) 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 34 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