Mer klasser och objekt Vi kikar in i klasserna, och tar en titt på några av vas inbyggda 67 Kodkonvention Klasser påbörs med stor bokstav (i övrigt små utom om flera ord då Inledande bokstav i övriga ord också görs stor) AClass Metoder/attribut inleds med liten bokstav (i övrigt små utom om flera ord då inledande bokstav i övriga ord också görs stor) amethod(), avariable Konstanter Bara stora bokstäver. Ord åtskiljs med _ PI Följer man dessa konventioner så kommer ens egna klasser att se ut som vas inbyggda. 68 Variabel eller metod private default protected public Nås i samma klass Visibility Nås i samma paket Nås i subklass Nås överallt 69 Överlagring Vi kan ha flera metoder/konstruktorer med samma namn bara dessa har olika signatur signatur : metodens namn och parametrar (antal,typ och ordning) Vilken version av metoden som används vid anrop beror på de aktuella parametrarna Ex: public int amethod(int x) {... public int amethod(int x, int y){... amethod() amethod(,) 7 Överlagrade konstruktorer Vill man att en av konstruktorerna i en klass ska anropa en annan (för att få en och samma kod på bara ett ställe) så gör man detta mha this() this() måste stå först i konstruktorn Ex: public Square() { this(6,5); public Square(int xpositionp,int ypositionp){ size = ;! xposition = xpositionp;! yposition = ypositionp;! color = "red"; isvisible = false; 7 Mer this I en metod refererar referensen this till det objekt vars metod för tillfället körs this kan användas till att referera till godtyckligt attribut/metod för objektet Används tex då parametrar har samma namn som attribut Ex public Square(int xposition,int yposition){ size = ;! this.xposition = xposition;! this.yposition = yposition;! color = "red"; isvisible = false; 7
String I Java en klass. Svarar mot en sekvens av tecken. String str= abc ; //finns även andra sätt skapa strängar Operationer på strängar + Strängkonkatenering Ex: hej + då => hejdå Antal: + => Antal: charat(int) tar fram bokstaven på en given position (numrerat från ) length() tar fram antal bokstäver i strängen equals(string) kollar om två strängar innehåller samma tecken mm. (se API beskrivningen) Enkel output Kan tex göras mha klassen PrintStream Fördefinierade standardströmmar: ström System.out System.err syfte skriva vanlig text skriva felmeddelanden 7 74 PrintStream Kontrollstrukturer i Java Huvudsakligen print och println metoder som skriver ut värden. println gör radbrytning efter utskrift print och println är överlagrade för alla primitiva datatyper, String och Object print och println finns för alla tänkbara datatyper 75 Samma som de som finns i C med i princip ett undantag (en specialvariant på forloopen som vi kommer titta på då vi tittar på collection-klasserna) if(villkor) if(villkor)... else while(villkor) do... while(villkor) for(init;villkor;förändring) 76 switch (expression) { case value: sats; break; case value: sats; break; default: satsn; switch-satsen OPTIONAL Uttrycket måste vara heltal, tecken eller enum (från va 7 även String) Motsvarar nästade if-satser 77 static Attribut och metoder kan deklareras static Associerar attribut och metoder med klassen snarare än objektet Avsteg ifrån objekts-tanken Bör därför användas bara där det verkligen behövs Undvik under denna kurs (utom för main) då ni ska lära er objektorientering. 78
Statiska attribut Normalt har varje objekt eget minnesutrymme static gör variabeln gemensam för alla objekt i klassen (dvs den delas av alla) private static int count; Kallas ibland klass variabler 79 Statiska metoder Statiska metoder anropas via klassnamnet Man behöver inte skapa ett objekt först Därför kallas de också klass metoder Exempel: Klassen Math i paketet va.lang innehåller statiska matematiska operationer Math.abs (num)! -- absolutbeloppet Math.sqrt (num)!-- kvadratrot Math.random ()! -- slumptal i intervallet [..) 8 Statiska metoder Statiska metoder får inte referera till instansvariabler (eftersom de instansieras först när ett objekt skapas) Får bara referera statiska variabler eller lokala variabler (som existerar oberoende av objekt) Även metoderna är specifika för objekt Får bara anropa statiska metoder (om den inte gör det via en instans) 8 Metoden main Metoden public static void main(string[] args)! Anropas automatiskt då man vill starta ett vaprogram Metoden måste se ut just som ovan (utom args som är en godtycklig identifierare) Denna metod får sedan se till så att de objekt som behövs av programmet skapas och exekverar metoderna som kör igång programmet 8 Konstanter Som variabler fast deras värde får inte ändras Markeras med reserverade ordet final Exempel: final double PI =.459; final char NEWLINE = \n ; Fördelar Vettiga namn istället för konstiga siffror eller tecken. Lättare att förstå koden. Enklare att uppdatera. Rätt ofta även deklarerade static så att bara en konstant finns för hela klassen. Fel och felhantering Ett program kan fungera korrekt i normalfallet men vara känsligt för störningar Felaktiga indata (från användaren/andra program) Yttre omständigheter Bra program är förberedda på att fel kan uppstå 8 84
Hur upptäcker man fel? Partiella funktioner: Funktioner som inte är definierade för vissa inputvärden Fel uppstår ofta då metoder får oväntade indata. Kontrollera indata i metoden innan något görs Kontrollera parametrarna innan metoden anropas Vad passar bäst? 85 Felhantering Vissa fel kan inte förebyggas med hjälp av if-satser En fil kan t ex raderas under skrivningen/läsningen, fast man har kollat i förväg att allt är OK Möjliga åtgärder: Avbryt eller avsluta programmet Ignorera felet och fortsätt Skriv ut ett meddelande och fortsätt Ignorera anropet som ledde till felet Tolka anropet på ett meningsfullt sätt Kräver åtgärd från användaren interaktivt Producera ett felaktigt resultat Returnera en felkod (går ej alltid)... 86 Hur bör man hantera fel? Det finns många alternativ Det finns ingen åtgärd som är bäst i alla lägen Beror på anroparens mål Låt anroparen bestämma Throw/ raise exception Kasta / flagga ett undantag Den anropade metoden överlåter åt anroparen att genomföra lämplig åtgärd Undantag En exception är ett objekt som signalerar ett undantag throw-satsen kastar ett undantag som kan fångas m h a en try-sats try { catch ( ) { finally { Satser där ett undantag kan kastas Undantaget som fångas Koden där ett undantag hanteras Koden för slutåtgärder (valfri) Flera undantag kan fångas och hanteras i en try-sats (valfri) 87 88 Arrayer och intro till Generics och Autoboxing Arrayer Deklarerar utrymme för många variabler i en enda deklaration Array (fält) Varje värde har ett numeriskt index i Java indexeras en med N element med indexen till N- Exempel: 4 5 6 7 8 9 results 79 87 94 8 67 98 87 8 74 9 89 9
Arrayer Alla värden har samma datatyp Får vara primitiva datatyper eller klasstyper I Java behandlas er som objekt Instansieras med new Namnet på fältet är en referens Index är av datatyp int OBS! Vid instansiering av ett fält med objekt instansieras ej objekten. Det skapas bara utrymmet för rätt antal referenser. Referenserna sätts till null vid skapandet. 9 Arrayer och hakparanteser Deklaration typename[] Name; (Observera att antalet värden ej ingår i typen vilket det delvis gör i C) Instansiering Name = new typename[numberofelements]; numberofelements godtyckligt uttryck av typ int Åtkomst av element Name[index] // index >= && index < numberofelements indexerar man sig utanför godkända index inträffar ett undantag (mer om dessa senare) 9 Exempel int[] results; results = new int[]; //..9 int i = ; char[] koder = new char[i]; Triangle triangles[]=new Triangle[i+]; Arrayer som datatyp Arrayer är en datatyp För varje datatyp finns en motsvarande datatyp Typen är typename[] Storleken ingår inte i datatypen Grundtypen bestämmer kompatibiliteten Även fält referenser är polymorfa 9 94 Fler exempel int[] results = new int[]; int[] results = new int[]; Primitiva datatyper Instansiera er Klasstyper int[] ; Triangle[] tarray; tarray results = results; results = results; OK, då samma datatyp = new int[]; tarray = new Triangle[]; tarray null null null [] = ; tarray[] = new Triangle(); tarray null 95 96 null
Instansiera er Glöm inte att instansiera en före användningen int[] results; results[] = 99; NullPointerException ett undantag, dessa kan bevakas och fångas upp för att hanteras, vilket vi kommer titta på på en senare föreläsning 97 Initialisera med listor Hela fältet kan initialiseras vid deklarationen int[] enheter = {47,, 89, 9, 54, 69, 97; char[] kursniva = {'A', 'B', 'C', 'D'; Längden bestäms av antalet element Endast vid deklarationen Observera: new används inte Ingen explicit storlek 98 Väl skapat är ens storlek fix Index måste referera till existerande element Index måste vara i intervallet storlek- Index kontrolleras dynamiskt (under körning) int[] = {,,, 4, 5; int i; i = [5]; Indexkontroll ArrayIndexOutOfBoundsException: 5 99 4 5 4 Arrayers storlek Varje Array objekt har ett publikt attribut length som anger antalet element, inte högsta index OBS! Leder ofta till off-by-one fel Används ofta i loopar Exempel: int[] = ; for (int i = ; i <=.length; i++) [i] ; for (int i = ; i <.length; i++) [i] ; Off-by-one fel, eftersom index löper från till.length- Objekt som element Elementen i en kan vara objektreferenser Circle[] cirkel = new Circle[5]; Fem referenser till objekt av typen Circle OBS! Inga objekt har skapats (referensen är null) cirkel[] = new Circle(); Objekten måste skapas separat t.ex. m.h.a. loop for (int i=;i < cirkel.length;i++) { cirkel[i] = new Circle(); cirkel[i].changesize((i+)*); Arrayer som parametrar Arrayreferensen överförs ( kopieras ) och den formella och aktuella parametern blir alias Ändringar påverkar båda Eftersom storleken inte är del av datatypen får den aktuella parametern ha godtycklig längd int[] = {,,, 4, 5;.aMethod (); public void amethod (int[] numbers) { numbers[] = 99; [] = ; numbers 99 4 5 4
Flerdimensionella er Görs i va i form av av av... En-dimensionella er motsvarar listor Två-dimensionella er motsvarar tabeller eller matriser med rader & kolumner Varje dimension har ett eget index Varje har har sin egen length dvs har vi en tvådimensionell så har kolumnen en lengt och varje rad sin Kan initialiseras med listor Ännu fler exempel int[][] matrix = new int[][]; int[][] matrix = {{, {,, {,,, {4, 44, 444, 4444 int[][][] matrix = new int[][][]; matrix[].length == ; matrix[].length == 4; matrix[][] = matrix[][]; matrix[] = matrix[]; matrix[] = matrix; Triangle[][][][][] fivedimensional; 4 Kopiera er Arrayvariabler är referenser Tilldelning gör ingen kopia på elementen i fältet int[] = {,,, 4, 5; int[] = new int[5]; = ; 4 5 4 4 5 Kopiera er System.copy gör kopia element för element Vid flerdimensionella er måste den anropas flera gånger Gör lämpligtvis i en (nästad) loop public static void copy ( Object source, int srcindex, Object dest, int destindex, int size) throws ArrayIndexOutOfBoundsException, ArrayStoreException Vi kan självklart göra det manuellt också 6 Klassen ArrayList (va.util) Ett objekt av klassen ArrayList liknar en Men Har dynamisk längd, dvs längden utökas efter behov Lagrar bara referenser till objekt Inte samma syntax för indexering Implementeras med er Generics I tidigare versioner av Java kan man göra generella klasser (tex ArrayList) med hjälp av Object. Fördel är att man behöver skriva koden till listan en enda gång och sen använda den oavsett vad som ska lagras. Nackdel är att man i en och samma lista kan lagra olika objekt huller om buller. (Först en bok, sen ett bibliotek följt av ett hus etc) En annan nackdel är att man behöver göra många explicita typkonverteringar i kod som använder sig av en klass som utnyttr Object. Mha generics så kan man istället specificera (vid konstruktion av objektet) vad som ska lagras 7 8
ArrayList<T> ArrayList<T> ( ) + add(t obj) + add (int index, T obj) + set (int index, T obj) + remove (int index) + T get (int index) + boolean contains (T obj) + boolean isempty ( ) + int indexof (T obj) + int size ( ) + clear ( )... 9 Effektiviteten av ArrayList När ett element sätts in flyttas (kopieras) alla efterfölnde element en position åt höger 4 5 6 7 8 9 79 87 94 8 67 98 87 8 74 9... sätt in på index 4 När ett element tas bort flyttas (kopieras) alla efterfölnde element en position åt vänster 4 5 6 7 8 9 79 87 94 8 67 98 87 8 74 9... Ej effektivt Autoboxing Utan generics och autoboxing Automatisk konvertering mellan primitiva typer och wrapperklasserna Integer, Float, Boolean etc Ex: Integer i = new Integer(9); Integer j = new Integer(); Integer k = i + j; //Typfel i va.4 I va sedan version 5 Kod kommer att infogas för att göra konverteringen så det kommer inte gå snabbare än om man gör det manuellt, men koden blir mindre plottrig import va.util.*; public class ArrayListTest { public static void main(string[] args){ ArrayList mylist = new ArrayList(); mylist.add(new Integer()); mylist.add("hejsan svejsan"); int testint=((integer)mylist.get()). intvalue(); System.out.println(testInt); Johan Eliasson Med generics och autoboxing import va.util.*; public class ArrayListTest{ public static void main(string[] args){ ArrayList<Integer> mylist = new ArrayList<Integer>(); mylist.add(); mylist.add("hejsan svejsan"); // Blir kompileringsfel ovan nu!! int testint = mylist.get(); // OBS! (Integer) och.intvalue borta System.out.println(testInt); Iteratorer Kan användas för att gå igenom samlingar av värden tex i Vector, ArrayList m.fl. Vector<Integer> v=new Vector<Integer>(); for(int i =;i<;i++) v.add(new Integer(i)); Iterator<Integer> it = v.iterator(); while(it.hasnext()) it.next() 4
For-each Ny variant på for-loopen. Tillkom i Java.5 (5) ArrayList<Integer> v=new ArrayList<Integer>(); for(int i =;i<;i++) v.add(new Integer(i)); for(integer value:v) value Funkar för er och alla klasser som implementerar interfacet Iterable 5