Översikt Introduktion till Java Språket Java Operatorer Kontrollsatser Överlagring This Klassens beståndsdelar Klassvariabler och klassmetoder Instansvariabler och instansmetoder Strängar Paket Programmering tillämpningar och datastrukturer 2 Klassen är statisk Objekt skapas Jfr syntax (vad som står) och semantik (hur det tolkas) Objekt skapas dynamiskt med Klass som mall new Klass(); Innan första new-anropet finns det inga objekt! Därför som main måste dekl. som static Statisk struktur vid editering En samling klassdefinitioner Program i Java Dynamisk omgivning under körning Objekt skapas och skickar sedan meddelanden till varandra Objekten kan variera från körning till körning Måste sättas i gång med ett första anrop I det läget finns det fortfarande inga objekt som kan anropa andra objekt! Programmering tillämpningar och datastrukturer 3 Programmering tillämpningar och datastrukturer 4 Måste köra igång i statisk miljö Det finns inga instanser när programmet ska köras igång Därför krävs en startmetod som kan köras direkt på klasser Klassmetod: main Startpunkten för ett program Placeras antingen i huvudklassen eller t.ex. i egen testklass Inga returargument public static void main(string[] args) { <skapa objekt> Tillhör klassen, inte dess instans Programmering tillämpningar och datastrukturer 5 Programmering tillämpningar och datastrukturer 6
Klassmetod: exempel public static void main(string[] args) { Djur[] alladjur = new Djur[3]; int i; Skapa objekt i en arvshierarki Object Object alladjur[0] = new Katt("Kurre"); alladjur[1] = new Hund("Vilma"); alladjur[2] = new Katt("Bamse"); i = 0; while(i < alladjur.length) { alladjur[i].presenteradig(); i = i + 1; Programmering tillämpningar och datastrukturer 7 Programmering tillämpningar och datastrukturer 8 Pingvin Pingvin Rovfågel Rovfågel Fågel Fågel Falk Falk Duva Duva Instansiering Instansiering Klasser kan ha många olika instanser Ex. pingvinen pelle Ex. pingvinen kalle Skapas utifrån klassens beskrivning av variabler och metoder Klassen = mall Objekt = instanser byggda från mallen Programmering tillämpningar och datastrukturer 9 instans av Pingvin egen kopia referens Object Object Fågel Fågel variabler från Object metoddef i Object Rovfågel Rovfågel Duva Duva variabler från Fågel metoddef i Fågel var från Rovfågel metoddef i Rovfågel var från Pingvin Pingvin Pingvin Falk Falk metoddef i Pingvin Programmering tillämpningar datastrukturer och 10 Konstruktion av instans: This Klassen Person class Person { int ålder; String yrke; Person (int ålder, String yrke) { ålder = ålder; yrke = yrke;? Klassen Person class Person { int ålder; String yrke; Person (int ålder, String yrke) { this.ålder = ålder; this.yrke = yrke; This Pekar på objektet som håller på att skapas Programmering tillämpningar och datastrukturer 11 Programmering tillämpningar och datastrukturer 12
De minsta byggstenarna: primitiva typer int heltal Java syntax short decimaltal float flyttal (32 bitar) double decimaltal (64 bitar) Bästa precision, men tar mest minne boolean logisk variabel (true eller false) char tecken (Unicode) Programmering tillämpningar och datastrukturer 14 Refererar till ett objekt: String sträng Andra variabeltyper String klass som kan skapas utan new String mystring = Kalle ; // ny instans av String Initiering av variabel Type var = (villkor)? så : annars; // initiera med det mindre talet int pwidth = (width1 > width2)? width2 : width1; Referens till objekt av typen Pingvin Pingvin pingvin1 = new Pingvin(); // kolla null-pointer, annars initiera via create() Graphics co = (componentgraphics == null)? null : componentgraphics.create(); Programmering tillämpningar och datastrukturer 15 Programmering tillämpningar och datastrukturer 16 Java hårt typat Java håller reda på typ av variabel Om variabeln är av typ int kan den bara referera till heltal Etc. Typomvandling (casting) Automatisk expandering (ökad noggr) int i = 3; double d = i; // automatisk casting (int omvandlas till double innan tilldelningen Åt andra hållet: manuell typomvandling double d = 4.8; int i = (int) d; // explicit casting (i = 4) Programmering tillämpningar och datastrukturer 17 Programmering tillämpningar och datastrukturer 18
Variabler (forts) Vissa metoder förväntar sig en variabel som refererar till ett objekt men jag vill skicka ett tal Som ju bara refererar till ett värde Vad göra? Wrapper classes Vill kunna skicka primitiva variabler till metoder som vill ha objekt Lägg in variabelns värde i en omslagsklass double d = 3.14; Double c = new Double(d); skrivut(c); Via omslagsklasser lätt att få reda på min-max värde för double, etc. Double.MAX_VALUE // konstant som finns definierad i klassen Double Programmering tillämpningar och datastrukturer 19 Programmering tillämpningar och datastrukturer 20 Konstanter Operatorer Deklareras som final Konvention Stora bokstäver samt _ private final double ANNUAL_RATE = 2.5; konstant endast tillgänglig inom klassen +, *, &&,,!, <=, ==,!= if (i!= 0 && j == n/i) { else if ( ) { else if ( ) { OK eftersom denna del inte evalueras om i == 0 Programmering tillämpningar och datastrukturer 21 Programmering tillämpningar och datastrukturer 22 ++ / -- Öka på före tilldelning i = i + 1; j = i; j = ++i; Öka på efter tilldelning j = i; j = i++; i = i + 1; Operatorer Kontrollsatser for (int i=1; i<max; i++) { for (Element el: myset) { i = while (i<max) { do { i = while (i<max) Programmering tillämpningar och datastrukturer 23 Programmering tillämpningar och datastrukturer 24
switch (nertrycktknapp) { case E: ändraelement(); break; case S: skrivtillfil(); break; default: vänta(); Switch vilken variabel som testet gäller om värdet är E Metoder Programmering tillämpningar och datastrukturer 25 Klassvariabler class BankKonto { private static double räntesats; private double saldo; BankKonto.räntesats egenskap hos klassen Samma för alla instanser (konton) pettersonskonto.saldo egenskap hos enskilt konto Klassvariabler Har ett värde oberoende av om det finns instanser av klassen SEB:s räntesats är oberoende av om det finns kundkonton Behöver inte skapa instans för att komma åt variabelns värde Matematiska konstanter Math.PI (= 3.14) Math.E (= 2.17) Programmering tillämpningar och datastrukturer 27 Programmering tillämpningar och datastrukturer 28 Varför heter det static? Klassvariabler Klassmetoder Lever i en statisk kontext Kan inte referera till dynamiska variabler Kan inte anropa dynamiska metoder Statiska = klass Dynamiska = instans Programmering tillämpningar och datastrukturer 29 Programmering tillämpningar och datastrukturer 30
Klassmetoder Klassmetoder public class BankKonto { private static double räntesats; private double saldo; public BankKonto() { // konstruktor public static void sätträntesats(double nyräntesats) { räntesats = nyräntesats; Obs! Klassmetoder kommer inte åt icke-statiska variabler! public double beräknasaldobesked() { return räntesats*saldo; public class TestFåglar { public static void main(string[] args) { Rovfågel kalle = new Rovfågel(); Pingvin pelle = new Pingvin(); kalle.flyga(); pelle.flyga(); Deklarera statiska variabler lokalt Programmering tillämpningar och datastrukturer 31 Programmering tillämpningar och datastrukturer 32 Under körning Klass Klassvariabler Kod för alla metoder Även kod för instansmetoder lagras hos klassen (är ju samma för alla instanser) Objekt (instans av klass) Instansvariabler Pekare till instansmetoders kod Obs! En klassmetod kan inte anropa en instansmetod för ex.vis. delberäkning Anrop till klass (statisk metod) 1. Klassen tar emot meddelandet 2. Variabeln this har inget värde Finns ju ingen instans (som vi vet om) 3. Finns metoden i klassen utförs den Letar annars uppåt i klasshierarkin 4. Metoden utförs i kontext av klassen (klassvariabler satta, klassmetoder åtkomliga) Programmering tillämpningar och datastrukturer 33 Programmering tillämpningar och datastrukturer 34 Anrop till instans 1. Metoden tar emot anropet 2. Variabeln this sätts att peka på instansen 3. Instansen letar upp vilken klass den är instans av Dynamisk 4. Instansen letar efter metod-definitionen bindningi sin klass Söker sig annars uppåt i klasshierarkin ända upp till Object 5. Argumenten som instansen fått sätts in, koden utförs 6. Metoden tillämpas i den kontext som instansvariabler och instansmetoder utgör Överlagring (overloading) public class Djur { private String mittnamn; private int födelseår; private static int nuvarandeår = 2005; public Djur() { mittnamn = Pelle ; födelseår = nuvarandeår; // konstruktor Programmering tillämpningar och datastrukturer 35 Programmering tillämpningar och datastrukturer 36
Överlagring (overloading) Signatur Kan även definiera variant med två parametrar public Djur(String namn, int ålder) { mittnamn = namn; födelseår = nuvarandeår - ålder; De två metoderna har olika signatur OBS! Inte samma sak som överskuggning, där metoderna ligger i olika klasser Ex. Pingvin - flyga Metodens Namn Parametrar: typ och antal public boolean set(int index, Object o) { Har signaturen: set(int, Object) Programmering tillämpningar och datastrukturer 37 Programmering tillämpningar och datastrukturer 38 Signatur = namn + par. Protokoll public class Hiss { public void åkupp(int våningar) { position = position + våningar; public double åkupp(int våningar) { position = position + våningar; return position; Compiler error (same signature in two places) Lista av klassens publika signaturer (utökat med returvärden) En klass som har följande metoder public boolean set(int index, Object o) { public Object get(int index) { Har protokoll boolean set(int, Object) Object get(int) Programmering tillämpningar och datastrukturer 39 Programmering tillämpningar och datastrukturer 40 Metodkategorier Konstruktor Skapar nytt objekt Initierar variabler Returnerar objektet Modifierare Ändrar objektets tillstånd (dvs. ändrar variabelvärden) Accessor Hämtar variabelvärden Metodkategorier (forts) I/O-relaterade metoder Ex.vis. skriver ut objektets innehåll Omvandlare Omvandlar objektet till annan datatyp tostring() Anropas automatiskt av bl.a. System.print() Kan få häftiga effekter om man inte har definierat tostring() clone() Programmering tillämpningar och datastrukturer 41 Programmering tillämpningar och datastrukturer 42
Primitiva variabler - referenser Primitiva variabler referenser Primitiv variabel (ex. int, float, double, boolean) Innehåller själva värdet Referens Adress till ställe i datorns minne Programmering tillämpningar och datastrukturer 44 Exempel Referens String myname = Kalle ; String backupmyname = myname; // save old value myname = Jens ; System.print(backupMyName); Jens?! steg1: steg2: myname myname Kalle Jens backupmyname steg3: Programmering tillämpningar och datastrukturer 45 Programmering tillämpningar och datastrukturer 46 Lösning Kopiera strängen String myname = Kalle ; // vill ha nytt objekt, dvs. ny sträng String backupmyname = String.copyValueOf(myName); myname = Jens ; Skapar ett nytt objekt Strängar Strängar kan inte ändras sedan de skapats Vid varje ändring slängs gamla strängen och nytt skapas Om många ändringar, bättre att använda StringBuffer System.print(backupMyName); Kalle Programmering tillämpningar och datastrukturer 47 Programmering tillämpningar och datastrukturer 48
StringBuffer StringBuffer sb = new StringBuffer( Hej hej ); Objektets innehåll kan ändras sb.append(" Kalle!"); sb.insert(7, ","); // lägg in ", på pos 7 sb.replace(4, 7, "då"); // ersätt bokst 4-7 med "då" System.out.println(sb); Hej då, Kalle! Operationer på strängar Konkatenering: String s = Mitt namn är + namn; Om x inte är av typen sträng anropas x.tostring() automatiskt Om tostring() inte definierad: letar efter tostring() uppåt i klasshierarkin Kan se jättekonstigt ut om tostringdefinitionen i Object måste tillämpas Obs! första pos = 0 Programmering tillämpningar och datastrukturer 49 Programmering tillämpningar och datastrukturer 50 Operationer på strängar Sökning efter delsträng: int index = s.indexof( är, 0); // söksträng, startindex Plocka ut en delsträng: s.substring(0, s.length-1); // startindex, slutindex Operationer på strängar Escape-tecken ( kommandotecken ) \n = ny rad (Unix) \n\r = ny rad (Windows textfiler) \t = tab s = namn + \t + ålder + \n ; Konvertering till och från tal int x = Integer.parseInt(s); String s = Integer.toString(42); Programmering tillämpningar och datastrukturer 51 Programmering tillämpningar och datastrukturer 52 s1 == s2 Jämföra strängar Jämför två pekare! Inte vad vi vill ha! I stället: s1.equals(s2); s1.equalsignorecase(s2); Sortera strängar: s1.compareto(s2) 0 om lika -1 om s1 < s2 1 om s1 > s2 Programmering tillämpningar och datastrukturer 53