Talbas - Radix Lektion 12 Repetition Genomgång av gammal tenta 123 10 = 1 10 2 + 2 10 1 + 3 10 0 = 100 + 20 + 3 = 123 1110 2 = 1 2 3 + 1 2 2 + 1 2 1 + 0 2 0 = 8 + 4 + 2 + 0 = 14 FA8 16 = 15 16 2 + 10 16 1 + 8 16 0 = 3840+160+8 = 4008 Bas (eller Radix): 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 Tillåtna tecken: 0 1 2 3 4 5 6 7 8 9 A B C D E F Radix kan alltså inte vara mindre eller lika med 0 Primitiva datatyper Typ Storlek Möjliga värden byte 8 bitar -2 7 till 2 7 1 short 16 bitar -2 15 till 2 15 1 int 32 bitar -2 31 till 2 31 1 long 64 bitar -2 63 till 2 63 1 char 16 bitar tecken i unicode-tabellen boolean 8 bitar true eller false float 32 bitar -3.40292347 10 38 till 3.40292347 10 38 double 64 bitar -1.7976313486231570 10 308 till 1.7976313486231570 10 308 Funktioner Returtypen är typen av det värde funktionen skall räkna fram En funktion måste avslutas med en return-sats. return uttryck; Return-satsen avbryter funktionen. Funktionens värde blir värdet av uttrycket Exempel: static int add(int a, int b) { return a+b; Procedurer Procedurer deklareras med returtypen void. En procedur måste inte avslutas med en return-sats. Om en return-sats används skall inget uttryck anges. Exempel static void skrivcos(double vinkel) { System.out.println(Math.cos(vinkel)); return; //behövs inte Att anropa en metod public class Metoder { //Funktions anrop int svar = add(2,5); System.out.println(add(2,5)); //Procedur anrop skrivcos(math.pi); public static int add(int a, int b) { return a+b; public static void skrivcos(double v) { double svar = Math.cos(v); System.out.println( Cos(v)= +svar); 1
Exempel på överbelastning public class OverbelastningsEx { static void skrivnågot(int x) { System.out.println( heltal ); static void skrivnågot(char c) { System.out.println( tecken ); static void skrivnågot(float x, Object o) { System.out.println(42); skrivnågot( A ); skrivnågot(132); skrivnågot(1.1, null); Metoderna skills alltså åt genom olika typer på argument och/eller med olika antal argument. Man kan inte skilja två metoder åt enbart genom returtyp. Arrayer & Matriser En array: [0] [1] [2] [3] [4] [5] Exempel: int a[] = new int[8]; int b[] = {1,2,3,4,5,6,7,8; En 5x4-matris: [0][0] [0][1] [0][2] [0][3] [1][0] [2][0] [3][0] [1][1] [2][1] [3][1] [1][2] [2][2] [3][2] Exempel: int c[][] = new int[5][4]; [1][3] [2][3] [3][3] [6] [0][4] [1][4] [2][4] [3][4] [7] Jämförelseoperatorer == Lika med!= Skilt ifrån < Mindre än > Större än <= Mindre eller lika med >= Större eller lika med Booleska operatorer!, && och Booleska operatorer användes på booleska uttryck (villkor) och variabler! betyder icke && betyder och betyder eller Lat evaluering Sanningstabell för!!true är lika med false!false är lika med true Samlingsslide för if-else, for och while Med villkor menas ett booleskt uttryck (dvs något som är antingen true eller false while-snurran while(villkor) { /* utför något så många gånger som man angett i villkoret */ if-else satsen if(villkor) { //utför något else if(villkor) { //utför något else { //utför något for-snurran for(initiering; villkor; uppräkning) { //utför något så många gånger som //man angett i villkoret Break och continue break Avslutar ett block (hoppar över alla rader nedanför breaksatsen i ett block) while(true) { //... if(slutanu) break; //... continue Fortsätter omedelbart med nästa varv i en snurra for(int i=0; i<a.length; i++) { if(a[i]==null) continue; //... Man kan använda return, men då hoppar man ur hela metoden 2
Konstruktorer En konstruktor konstruerar ett objekt En konstruktordeklaration ser ut på följande sätt: class Klassnamn { Klassnamn(argumentdeklarationer) metodkropp Konstruktorn används vanligtvis för att initiera instansvariabler Om ingen konstruktor deklareras tillhandahålls automatiskt en s.k. defaultkonstruktor Genom att utnyttja överbelastning kan man ha flera konstruktorer En konstruktor har samma namn som klassen, dessutom saknar den returtyp vilket är kännetecken som skiljer den från en vanlig metod operatorn this Åsyftar den här klassen Typiska användningsområden: Kunna använda samma namn på instansvariabel/klassvariabel och lokal variabel. Använda den egna klassen som argument till någon metod public class JavaClock implements ActionListener { private ClockGUI clockwin; public JavaClock(String bild) { clockwin = new ClockGUI(bild); clockwin.addactionlistener(this); Instansvariabler och instansmetoder En instansvariabel deklareras direkt i en klass (dvs ej i någon metod) Har-en relationen En instans av en klass har instansvariabler Instansvariablerna definierar egenskaperna unika för en instans av en klass En instansmetod verkar på en instans av en klass Exempel: String s = Goodbye World! ; System.out.println(s.length()); instansvariabler och instansmetoder deklareras utan nyckelordet static Klassvariabler och klassmetoder En klassvariabel är gemensam för alla instanser av en klass En klassvariabel deklareras på följande sätt: class Klass { static int klassvariabel; Går att komma åt från andra klasser på följande sätt: int x = Klass.klassvariabel; En klassmetod är en metod som alltid existerar Klassmetoder kan anropas utan att någon instans av klassen har skapats Klassmetoder associeras med en klass Klassvariabler och klassmetoder deklareras med nyckelordet static: static void klassmetod() { // etc. Modifierare Vid deklarationer av variabler, metoder och klasser kan man förrutom typ ange modifierare (ej lokala variabler) static anger klassvariabler och klassmetoder public offentlig variabel (el. metod) private privat variabel (el. metod) protected skyddad variabel (el. metod) final i samband med variabeldeklaration anger en konstant abstract abstrakt Andra modifierare: native, synchronized, transient, volatile class Kurs { public String kurskod; //private variabler ärvs inte ner public Kurs(String kurskod) { this.kurskod = kurskod; public void skrivtenta() { System.out.println("Skriv tenta på papper i kurs + kurskod); class SMD134 extends Kurs { private int antalelever; public SMD134(String kod, int antalelever) { super(kod); // Måste stå först this.antalelever = antalelever; public void skrivtenta() { System.out.println(antalElever + " elever skriver tenta i kurs "+kurskod); 3
Arv och överskuggning (forts) public class Arv { Kurs a = new Kurs("TST001"); Kurs b = new SMD134("SMD134", 36); SMD134 c = new SMD134("SMD134", 36); a.skrivtenta(); b.skrivtenta(); c.skrivtenta(); Resultat från körning Skriv tenta på papper i kurs TST001 36 elever skriver tenta i kurs SMD134 36 elever skriver tenta i kurs SMD134 abstract Enklare exempel abstract class Musik { abstract String typ(); // en abstrakt metod public void spelamusik() { System.out.println("Spelar musik på en " + typ()); // kan alltså anropa typ() eftersom jag VET att subklasserna kommer att ha // implementerat metoden typ (de tvingas till det för att inte själva bli abstrakta) class Trumpet extends Musik { String typ() { return "Trumpet"; class CDSpelare extends Musik { String typ() { return "CD-Spelare"; Interface - deklaration public interface Interfacenamn { konstantdeklarationer abstrakta metodhuvuden Att implementera ett interface class Klassnamn implements Interfacenamn { attribut och satser metoder implementation av samtliga metoder deklarerade i det implementerade interfacet public class TestException { try { System.out.println(dividera(6,0)); catch (DivByZeroException e) { System.out.println(e.getMessage()); static int dividera(int a, int b) throws DivByZeroException { try { return a/b; catch (ArithmeticException e) { throw new DivByZeroException("Division med noll"); class DivByZeroException extends Exception { public DivByZeroException(String e) { super(e); En övningstenta (del 1) Del 1 grundläggande teori och användande av Javadokumentation Fråga 1: Observera följande klasser public interface Högtalare { public void spelauppanalogsignal(); public interface Mikrofon { public String hämtaanalogsignal(); public interface Telefon extends Mikrofon, Högtalare { public void ring(string telefonnr); public void prata(); abstract class GSM { abstract byte[] tilldigital(string analogsignal); public final class Mobiltelefon extends GSM implements Telefon { //... ett flertal attribut och metoder 4
Fråga 1 : forts 1. Vad betyder det att Mobiltelefon är public? 2. Vad betyder det att Mobiltelefon är final? 3. Vad betyder det att Mobiltelefon extends GSM? 4. Vad betyder det att Mobiltelefon implements Telefon? 5. Vilka metoder måste finnas i Mobiltelefon? 6. Förklara begreppet interface 7. Förklara begreppet abstract (både för klasser och för metoder) Svar fråga 1 1. Det betyder att den är offentlig, man kan komma åt den från andra klasser och paket 2. Det betyder att den är slutgiltlig det går inte att ärva Mobiltelefon 3. Det betyder att Mobiltelefon ärver GSM dvs Mobiltelefon är en GSM. Detta betyder att egenskaperna som GSM har också gäller för Mobiltelefon. 4. Det betyder att Mobiltelefon använder gränssnittet Telefon dvs den uppfyller kraven för att få kallas Telefon. Ytterligare gäller att Mobiltelefon måste uppfylla kraven för att få kallas Mikrofon och Högtalare eftersom Telefon i sin tur använder gränssnitten Mikrofon och Högtalare. 5. De metoder som måste finnas är de abstrakta metoder som finns i GSM samt de metoder som finns definierade i Telefon, Mikrofon samt Högtalare public void spelauppanalogsignal() public String hämtaanalogsignal() public void ring(string telefonnr) public void prata() abstract byte[] tilldigital(string analogsignal) 6. interface är ett gränssnitt det används för att beskriva hur något skall se ut. Används ofta när man jobbar i grupp och de olika gruppmedlemmarna är ansvariga för olika delar av programmet. Man gör alltså ett gränssnitt för att i förväg bestämma hur man använder en del av programmet. 7. En abstrakt metod är en metod som saknar kod men som finns för att subklasser skall följa en viss standard. En abstrakt klass går inte att initialiseras, den innehåller ofta abstrakta metoder Fråga 2 Double uppg2 = Double.valueOf("2.9"); Betrakta ovanstående uttryck. Vilket värde och vilken typ för följande uttryck? 1.new Double(uppg2); 2.new Double(uppg2.doubleValue()).doubleValue(); 3.new Double(uppg2.doubleValue().doubleValue()); 4.new Double(uppg2.doubleValue()).intValue(); Svar: 1. Kommer inte att fungera. Det finns ingen konstruerare som tar en Double som argument 2. typ: double värde: 2.9 3. Kommer inte att fungera. Man kan inte anropa doublevalue() för en double 4. typ: int värde: 2 Fråga 3 Vad skrivs ut när följande program körs? public class Uppg3 { public static int b=4, c=42; public static int a[] = {9,8,7,6,5,4,3,2,1,0; funk(c,a,b); System.out.println(a[b]+c); static void funk(int a, int b[], int c) { b[c]=a; a=13; c=22; Svar: 84 5
Metoden valueof i klassen Integer Fråga 4 Vilka av följande uttryck leder till att det kastas ett Exception och vilket Exception kastas? Metoden indexof i klassen String 1.Integer a = Integer.valueOf("FF", 10); 2.Integer b = Integer.valueOf("-FF", 16); 3.Integer c = Integer.valueOf("FEL", 22); 4.Integer d = Integer.valueOf("", 2); 5.Integer e = Integer.valueOf("0",0); Svar: 1, 4 och 5 kastar NumberFormatException Metoden substring i klassen String Fråga 5 Skriv en metod som givet en e-postadress (som en sträng) returnerar det som står före @-tecknet som en sträng Svar: public static String mailnamn(string adress) { return(adress.substring(0,adress.indexof("@"))); 6