Idag Javas datatyper, arrayer, referenssemantik Klasser Arv, polymorfi, typregler, typkonvertering Strängar Tänker inte säga nåt om det som är likadant som i C. Objectorienterad programmering Sida 1
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 2
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 3
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 4
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 Objectorienterad programmering Sida 5
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 6
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? Objectorienterad programmering Sida 7
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 8
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}; Objectorienterad programmering Sida 9
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; a = new int[100]; int y = a.length; Objectorienterad programmering Sida 10
Inte som i C (forts) null står för ingen array. int[] a = null; betyder samma sak som int[] a; Objectorienterad programmering Sida 11
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 12
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". Objectorienterad programmering Sida 13
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 14
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) Objectorienterad programmering Sida 15
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 16
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. Objectorienterad programmering Sida 17
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 18
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"); Objectorienterad programmering Sida 19
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 20
Referensvariabler och referenssemantik(forts) Givet en klassdefinition class X {... } och en variabeldeklaration X a; Variabeln a lagrar en referens. Objectorienterad programmering Sida 21
Exempel: X a, b; a = new X(); b = a; Referensvariabler (forts) Nu refererar a och b till samma objekt. Objectorienterad programmering Sida 22
Referensvariabel, regel Variabler av klasstyp har referenssemantik. Nya objekt skapas med new. Tilldelning kopierar referensen, inte objektet. Objectorienterad programmering Sida 23
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 24
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). Objectorienterad programmering Sida 25
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); Objectorienterad programmering Sida 26
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 27
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 28
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); Objectorienterad programmering Sida 29
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 30
Arv En klassdefinition class A extends B {... } definierar en klass A som ärver av B. Klassen A ärver alla fält och metoder som är definierade för B. A är en subklass till B. B är en superklass till A. Objectorienterad programmering Sida 31
Arv: Ett exempel Fyra klasser: Fordon Motorfordon Bil Cykel Toppfarten för en cykel beräknas från cyklistens ålder. Toppfarten för en bil beräknas från motorstykan. Objectorienterad programmering Sida 32
Arv: Fordonsexempel class Fordon { } class Motorfordon extends Fordon { private double toppfart; Motorfordon (double t) { toppfart = t; } double gettoppfart() { return toppfart; } } Objectorienterad programmering Sida 33
Arv: fordonsexempel (forts) class Bil extends Motorfordon { int motorstyrka; int antal_hjul; Bil(int m, int h){ super(m *1.5); //Antar att toppfarten är motorstyrkan * 1.5 } } motorstyrka = m; antal_hjul = h; Objectorienterad programmering Sida 34
Arv: fordonsexempel (forts) class Cykel extends Fordon { private Person cyklist; Cykel (Person p) { cyklist = p; } double gettoppfart () { if (cyklist.ålder > 60) return 10; if (cyklist.ålder > 25) return 20; return 30; //Larvigt... } } Objectorienterad programmering Sida 35
Arv Hur kan klasser kan relateras genom arv? Arv betyder att en klass ärver implementation av en annan Klasserna bör vara konceptuellt relaterade Exempel: Fordon -> Motorfordon -> Bil Objectorienterad programmering Sida 36
Använd arv endast när Rekommendation det är lämpligt att ärva implementation, och subklassen representerar en delmängd av superklassen Ofta är det lämpligt att introducera en ny klass som rymmer gemensamma datastrukturer och metoder. Objectorienterad programmering Sida 37
Polymorfi En variabel av klasstyp kan bindas till ett objekt av en subklass. Exempel: Fordon f = new Bil(); Objectorienterad programmering Sida 38
Polymorfi... Utöka klassen fordon med metoderna gettoppfart (abstrakt) och beskriv. abstract class Fordon { abstract double gettoppfart (); } void beskriv () { System.out.println("Detta fordon har toppfart " + gettoppfart()+" km/h"); } Objectorienterad programmering Sida 39
Kod för att testa... Person p = new Person("Olle", 24); Cykel c = new Cykel (p); Bil b = new Bil (100, 4); System.out.println("Cykel..."); c.beskriv(); System.out.println("Bil..."); b.beskriv(); Fordon f = new Cykel(new Person("Nisse", 99)); System.out.println("Fordon?..."); f.beskriv(); Objectorienterad programmering Sida 40
Körexempel svenolof@harpo$ javac Fordonstest.java svenolof@harpo$ java Fordonstest Cykel... Detta fordon har toppfart 30.0 km/h Bil... Detta fordon har toppfart 150.0 km/h Fordon?... Detta fordon har toppfart 10.0 km/h Objectorienterad programmering Sida 41
Typer Vi talar om typen av en variabel och typen av ett objekt Typen av en variabel är statisk, givet av programmet och ändras aldrig. Ett objekt får en viss typ när det skapas (med new). Typen ändras aldrig. Objectorienterad programmering Sida 42
Typkonvertering Där ett objekt av klass K förväntas kan man använda ett objekt av en subklass (implicit knvertering) Anta: ett objekt av klass K förväntas, vi har en variabel av en superklass, bunden till ett objekt av klass K. Vi kan konvertera referensen till klass K via explicit typkonvertering. Kompilatorn lägger in ett test för att kontrollera att typen är som angetts Objectorienterad programmering Sida 43
Bil b = new Bil(...); Typkonvertering, exempel Fordon f = b; //OK Bil b1 = f; //Kompileringsfel Bil b1 = (Bil)f; //OK Cykel c = (Cykel)f; //Fel vid körning Objectorienterad programmering Sida 44