Föreläsning 17 Repetition
Källkodsformat Unicode används åäöμψζ tillåtna i namn på identifierare Inte alla miljöer klarar av det Källkod Bytekod Java VM för Macintosh Java VM för Windows.java.class ÅÄÖ… … använd helst inte dessa som namn på identifierare.
Den Virtuella Javamaskinen Läser, tolkar och exekverar bytekod Är skrivet för aktuell plattform Måste skaffas om den inte finns Bytekod- filer Virtuell Java Maskin Underliggande Operativ System läser anropar
Klasser Javaprogram beskrivs i klasser En klass är en typdefinition av något En klass består av fält och metoder fält: data som ska associeras till klassen metod: operationer som ska utföras Klass Fält (medlemsvariabler) Metoder Satser Villkor Iterationer (loopar)
public class Punkt { // Inledande vänsterklammer } // Avslutande högerklammer Klassdeklaration Exempel Notera! En klass kan aldrig deklareras som privat (private). (åtkomstodifierare) class Namn (extends) Vissa modifierare kan uteslutas
private int xkord; Fältdeklaration Åtkomstmodifierare Skilj mellan fältvariabler och andra variabler. T.ex lokala variabler som deklareras i en metod. Fälttyp Fältnamn Fält kan vara primitiva typer eller objekt
public void setX(int x) Metoddeklaration En metod är åtkomlig i hela den egna klassen. Dvs den kan anropas från alla andra metoder i klassen Åtkomstmodifierare Returtyp Metodnamn Kodsatser inom matchande klamrar Parametrar
Att Skapa Objekt Enda sättet att skapa är med new Punkt p = new Punkt(); Punkt p; // p == null p = new Punkt(); Eller new returnerar en referens som lagras i objektet p (av typen Punkt ) Med instanceof kan vi testa vilken klass objektet är av p.setX(100); // metodanrop
Åtkomstmodifierare Fyra olika åtkomstformer finns för fält och metoder public - alla kommer åt medlemmen protected – arv, klasser i samma paket private – bara den egna klassen paketåtkomst – i samma paket (default om inget anges)
Parametrar Parametrar används för att skicka information till en metod Parametrar överförs via värdeanrop d.v.s endast en kopia skickas För objektreferenser refererar dock kopian till samma som originalet public void setX(int x) { xkord = n; }
Returvärden Returvärden används för att skicka information tillbaka från en metod Alla metoder har en returtyp, men alla behöver inte returnerar något När en metod returnera ett värde tilldelas metodanropet värdet. obj.setTal(10); obj.getTal(); public int getTal(){ return tal; } obj.getTal() ersättas med 10 10
Reglerar hur ett objekt ska skapas Initierar normalt klassens fält Saknar returtyp Har samma namn som klassen Eventuellt parametrar Konstruktorn public Punkt()
Överlagring Av Metoder Flera metoder med samma namn Varje ny variant måste ha en egen signatur, d.v.s olika antal eller olika typer på parametrarna. Den metod som passar bäst anropas public void skrivUt(String s) { // kod för att skriva ut strängen s } public void skrivUt(String s, Color c) { // kod för att skriva ut strängen s i färgen c } signatur
Primitivatyper boolean boolsk typ char 16-bitar Unicode byte 8-bitars heltal short 16-bitars heltal int 32-bitars heltal long 64-bitars heltal float 32-bitars flyttal double 64-bitars flyttal Samtliga typer är definierade i detalj Finns motsvarande ”wrapper”-klasser
Operatorer Logiska operatorer !, &&, ^, || Aritmetiska operatorer *, /, %, +, - Inkremeteringsoperatorer ++, -- Tilldelningsoperatorer =, +=, -=, *=, /=, %= Jämförelseoperatorer, =, ==, != Villkorsoperatorn op1 ? op2 : op3 Kom ihåg prioritet och associativitet! PrioOperatorTyp 1( )paranteser ökning, minskning 3* / %multiplikation, division, modulus 4+ -addition, subtraktion 5 = mindre-, större än (eller lika med) 6== !=är lika med, skiljt ifrån
Typkonverteringar Implicit konvertering int i = 13; // automatisk "cast" long l = i; // long är större än int double d = i; // double rymmer en int int i = 13; // påtvingad ”cast” char ch = (char)i; // char (16 bit) < int (32 bit) double d = ; // float f = (float)d; // Kan tappa precision!! Explicit konvertering Även möjligt att konvertera objekt Object obj = new Person("Kalle", 33); Person p = (Person)obj;
Villkorskonstruktion if (a > b) { // a är större än b } else { // b är större än a } if (a > b) { // a är större än b } else if (a == b) { // a är exakt som b } else { // b är större än a } int val = Integer.parseInt(s); switch(val) { case 1: // Kod om användaren matat in 1 System.out.println("Du valde 1"); break; case 2: // Kod om användaren matat in 2 Person p = new Person("Kalle", 33); break; case 43: // Kod om användaren matat in 43 skrivUt(); break; case 4: System.exit(0); break; default: System.out.println("Ogiltigt, välj igen!"); }
Iterationskonstruktioner for (int i = 0; i <= 10; i++) { System.out.println(i); } int i = 0; while(i <= 10) { System.out.println(i); i++; } int i = 0; do { System.out.println(i); i++; } while(i <= 10);
Avbrott for (int i = 0; i <= 8; i++) { if (i == 5) { break; } System.out.println(i); } for (int i = 0; i <= 8; i++) { if (i == 5) { continue; } System.out.println(i); } public boolean even(int t) { if (t % 2 == 0) return true; else return false; } public void loop(int a) { for (int i = 0; ; i++) { System.out.println(i); if (i == a) return; } }
Arv (extends) Definierar en klass utifrån en redan existerande klass Den nya klassen utökar den ärvda ”Får” alla egenskaper den gamla har Lägger till nya egenskaper (fält) och utökar beteendet (nya metoder) En klass kan endast ärva från en och endast en klass
Vilka Medlemmar Ärvs? De medlemmar i en superklass som är deklarerade public eller protected. Ärver inte de medlemmar i en superklass som har samma namn som en medlem i subklassen Metoder omdefinieras Fält göms Ärver inte konstruktorn som inte är en medlem av klassen
Konstruktorer Vid Arv Konstruktorer ärvs inte! I en subklass konstruktor måste ett anrop på en konstruktor i super- klassen ske När enbart default-konstruktorn används behöver inget anrop göras public Rektangel(int x, int y, double bredd, double langd) { super(x, y); this.bredd = bredd; this.langd = langd; }
Super Super kan användas till anrop av en omdefinierad metod Super kan användas till anrop av konstruktorer i superklassen Super kan användas för att referera till en variabel i superklassen public void skrivUt() { System.out.println("Artist: " + artist); super.skrivUt(); }
Abstrakta Klasser En abstrakt klass: är inte komplett går inte att skapa objekt av kan endast ärvas av andra klasser används när implementationen för några, men inte alla, metoder kan tillhandahållas
Abstrakta Metoder En abstrakt metod: saknar implementation har endast en signatur (namn, returtyp och parametrar) implementeras i subklasser Finns minst en abstrakt metod måste hela klassen vara abstrakt public abstract class Djur { public abstract void sov(); }
Arrayer Lagrar flera värden av samma typ I java ses en array som ett objekt int[] tal = new int[10]; int tal[] = new int[10]; Eller så här: int[] tal; // Deklarerar tal = new int[10]; // Skapar Arrayens namn är tal Arrayen innehåller 10 element av typen int tal[0], tal[1], …, tal[9]
Initiering och Storlek En array kan ges värden när den skapas Omges av klamrar, separeras med komma int[] tal = {79, 87, 94, 82, 67, 98, 87, 81}; // 8 element double[] tal = {1.21, , 0.02, 10.1, 0.0}; // 5 element String[] betygSkala = {"IG", "G", "VG", "MVG"}; // 4 element Person[] f = {new Person("Pappa Svensson", 33), new Person("Dotter Svensson", 8)}; // 2 element När en array har skapats har den en fast storlek, som inte kan förändras Konstant length innehåller antal element int antal = betygskala.length; System.out.println(antal);// Skriver 4
Skicka och Returnera En array kan skickas som parameter int[] tal = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; add1(tal); public void add1(int[] t) { for (int i = 0; i < t.length; i++) t[i]++; } Det är referensen till arrayen som skickas En metod kan även returnera en array int[] tal = skapaHeltalsArray(); public int[] skapaHeltalsArray() { int[] t = new int[10];... return t; }
java.util.Vector Kan ses som en dynamisk array Använder metoder för att bl.a. lägga till, ta bort och returnera objekt Består internt av en array av Object Kan lagra alla typer av objekt (samtidigt) Konvertera när vi hämtar ut objekten Kan inte hantera primitivatyper Finns i paketet java.util
java.lang.String Strängar i Java hanteras som objekt av klassen String Finns flera användbara metoder för att undersöka strängar Kan inte modifieras efter skapandet! Liknar till en viss del primitiva typer För att jämföra två strängar används metoden equals eller compareTo == kollar om referensen är den samma