Programmering för språkteknologer II, HT2014 evelina.andersson@lingfil.uu.se Rum 9-2035 http://stp.ling.uu.se/~evelina/uv/uv14/pst2/
Idag - Kursplan och planering - Repetition - Objektorientering Klasser Arv Polymorfism Gränssnitt 2
Kursplan Mål Efter avslutad kurs skall studenten för att förtjäna betyget Godkänd minst kunna: - redogöra för följande begrepp och självständigt utforma Javaprogram som exemplifierar och drar nytta av dem: paket och synlighet, objektorientering: --- arv, polymorfism, abstrakta klasser, gränssnitt, undantag, reguljära uttryck, hashtabeller och mappningar; 3
Kursplan Mål Efter avslutad kurs skall studenten för att förtjäna betyget Godkänd minst kunna: - i Java implementera elementära algoritmer för dessa typer av uppgifter, och föra grundläggande resonemang om deras tidskomplexitet: stackar, köer och listor, sökning, sortering. 4
Kursplan Examination Tentamen: Alla lärandemål, speciellt teorin Laborationer: framförallt praktiska - Lab 0. Objektorientering, synlighet - Lab 1. Regulära uttryck, automater, hashtabeller - Lab 2. Sökning, sortering - Lab 3. Stackar, köer, listor, undantag, paket - Lab 4. Objektorientering, applicering av övriga lärandemål 5
Kursplan Innehåll - Två teoretiska delar: Objektorientering Datastrukturer och algoritmer - Ni ska även kunna applicera delarna praktiskt egen implementering Förstå och använda Javas implementationer 6
Kursplan Betyg Betyget G: Betyget G på tentamen Betyget G på laboration 1-4 Betyget VG: Betyget VG på tentamen Betyget G på laboration 1-4 7
Planering Följer laborationernas innehåll: V. 36 Introduktion, objektorientering Fö 0, Lab 0 V. 37 Reguljära uttryck, automater, hashtabeller, läsning/skrivning Fö 1, Lab 1 V. 38-39 Sökning, sortering, generics Fö 2, (3), Lab 2 8
Planering Följer laborationernas innehåll: V. (38) 39-41 Stackar, köer, listor, interface, paket Fö 3-4, Lab 3 V. 41-44 Fördjupning och applicering av kunskaper Fö 5, Lab 4 V. 45 Repetition, tentamen Fö 6, tentamen 9
Laborationer - Utförande - 5 laborationer - Redovisning: laboration 0 : ingen redovisning laboration 1 4: skriftlig redovisning (via mail) - Laborationerna får göras två och två Ni väljer själva vem ni vill arbeta med Det underlättar om båda är på ungefär samma nivå Man får arbeta själv om man vill 10
Laborationer - Förberedelser - För att utnyttja laborationstillfället kan ni förbereda er: Läs alltid igenom laborationen innan laborationstillfället Läs relevant litteratur Börja programmera Laboration 0 nu på onsdag behöver inte förberedas i förväg, men börja gärna arbeta med den idag. 11
Laborationer - Omfattning - Blir större och större och mer omfattande - Mer tid finns för det större laborationerna, speciellt laboration 3 och 4. - Planera för det! 12
Laborationer - deadlines - Rekommenderade deadlines Laboration 1: 17/9 Laboration 2: 29/9 Laboration 3: 13/10 Laboration 4: 29/10 - i fas med kurs - Slutlig deadline: 7/11 - Uppsamling: 6/12 13
Datum för tentamen Tentamen: 7/11 Omtentamen: 12/12 14
Kurslitteratur Kursbok: Eck, David J. Introduction to Programming Using Java. Alternativ litteratur: Clifford A. Shaffer. Data Structures and Algorithm Analysis (Java version) Bruno R. Preiss. Data Structures and Algorithms with Object-Oriented Design Patterns in Java Böcker på svenska: Holm, Per. Objektorienterad programmering och Java. Studentlitteratur. Skansholm, Jan. Java direkt med Swing. Studentlitteratur. 15
Kursarbete - 7,5 hp motsvarar 200 timmars arbete Schemlagt: 32 timmar 7*2 h föreläsningar, 7*2 h laborationer, 4 h tentamen Eget arbete: 168 timmar - Arbete med laborationer - Läsning och föreberedelse för tentamen - Eget arbete med programmering 16
Repetition 17
Programskal Enkel klass public class Name{ public static void main(string args[]) {... Koden behöver sparas i filen Name.java 18
Programskal Enkel klass public class Name { public static void printnumber(int i) { System.out.println("The number is" + i); public static void main(string args[]) { printnumber(4711); 19
Programskal Kompilera och exekvera > javac Name.java > java Name The number is: 4711 20
Metoder En rad programsatser som beskriver hur en metod utför något. sats; 21
Metoder Indata: meningsfulla argument/parametrar: arg_1 arg_2... arg_n sats; 22
Metoder Indata: Lämpliga argument/parametrar Utdata: Resultatet (valbart) arg_1 arg_2... arg_n sats; resultat 23
Lokala variabler public class Main{ i j 5 public static void main(string args[]) { // deklarera i utan tilldelning int i; // deklarera j med tilldelning int j = 5; 24
Lokala variabler public class Main{ public static void main(string args[]) { // deklarera i utan tilldelning int i; // deklarera j med tilldelning int j = 5; // i tilldelas värde 4 i = 4; // i tilldelas samma värde som j, dvs 5 i = j; 25
Enkla typer - Heltal Typ Minsta värde Högsta värde byte - 127 128 short - 32 768 32 767 int -2 147 483 648 2 147 483 647 long -9 223 372 036 854 775 808 9 223 372 036 854 775 807 26
Enkla typer - Decimaltal Typ Minsta värde Högsta värde Noggrannhet float 7 siffror double 3,4 10 38 3,4 10 38 1,7 10 308 1,7 10 308 15 siffror 27
Enkla typer - Sanningsvärden Typ Minsta värde Högsta värde boolean falskt sant 28
Enkla typer - char char är en teckentyp Exempel: char c = 'A'; 29
Normalt programflöde sats; sats; sats; 30
Normalt programflöde- exempel public class Normal{ public static void main(string args[]) { int i = 4; int j = 5; boolean samenumber = (i == j); System.out.println(sameNumber); 31
Villkorsflöde sant? sats; falskt sats; sats; sats; sats; sats; 32
Villkorsflöde Exempel 1 public class Condition{ public static void main(string args[]) { int i = 4; int j = 5; if(i == j) System.out.println("Same number"); else { System.out.print("Not the same "); System.out.println("number"); 33
Villkorsflöde Exempel 2 public class Condition{ public static void main(string args[]) { int i = 4; int j = 5; if(i == j) { System.out.println("Same number"); else if ( i < j){ System.out.print("First number smaller"); else { System.out.print("First number bigger"); 34
Upprepningsflöde? sats; sant falskt steg; sats; sats; 35
Upprepningsflöde Exempel 1 public class While{ public static void main(string args[]) { int i = 0; while(i < 4) { System.out.println(i); i++; 36
Upprepningsflöde Exempel 2 public class For{ public static void main(string args[]) { for(int i = 0; i < 4; i++) System.out.println(i); 37
Fält(array) Ett fält(array) är en samling element av samma typ. index: 0 1 2... n 38
Fält(array) Ett fält(array) är en samling element av samma typ. Exempel: int[] array = new int[5]; array index: 0 1 2 3 4 39
Fält(array) Ett fält(array) är en samling element av samma typ. Exempel: int[] array = new int[5]; array[2] = 17; array index: 17 0 1 2 3 4 40
Fält(array) Ett fält(array) är en samling element av samma typ. Exempel: int[] array = new int[5]; array[2] = 17; array[4] = 42; array index: 17 42 0 1 2 3 4 41
Fält(array) Att loopa genom ett fält public class ForArray{ public static void main(string args[]) { int[] array = new int[5]; array[0] = 34; array[1] = 100; array[2] = 17; array[3] = 500; array[4] = 42; for(int i = 0; i < array.length; i++) System.out.println(array[i]); 42
Fält(array) Att loopa genom ett fält public class ForEachArray{ public static void main(string args[]) { int[] array = new int[5];... for(integer i: array) { System.out.println(i); 43
Argument till programmet public class CmdTest{ public static void main(string args[]) { if(args.length >= 1) { System.out.println("Hello " + args[0]); else { System.out.println("What is your name?); 44
Kodkonventioner Beskriver hur kod ska se ut Viktigt för att få koden läsbar Konsekvens(speciellt om man är flera) Exempel: Klassnamn börjar på stor bokstav Variabler/metoder börjar på liten bokstav Den kod ni skriver i laborationerna ska följa Oracles kodkonventioner. 45
Hur använder man javafilen? 1. Öppna terminalen 2. Gå till den katalog där filen med koden finns i (använd kommandot cd) 3. För att kompilera filen skriver man: javac Filnamn.java 4. För att köra programmet skriver man: java Filnamn 46
Objektorientering - Klasser - Instans- och klassvariabler - Instans- och klassmetoder - Arv - Polymorfism - Gränsnitt - Synlighet och inkapsling - UML-diagram 47
Klasser/Objekt Klass beskriver objekt class Circle{... class Square{... 48
Klasser i Java - Standardklasser: String, File, ArrayList Vanliga metoder för dessa: String s; if(s.length() > 0) { String t = s.tolowercase(); String[] words = s.split("\\w+"); //... 49
Klasser i Java - Skillnad på array och ArrayList //Fast storlek String[] name = new String[5]; //Varierande storlek ArrayList<String> = new ArrayList<String>(); (implementeras som en array med fast storlek, men storleken ändras vid behov) 50
Klasser i Java - Wrapper-klasser klasser för att hantera enkla typer: Integer int Double double Används när man behöver en klass Exempel: ArrayList<Integer> tal; 51
Klasser i Java Autoboxing/Unboxing - Autoboxing: enkel datatyp konverteras till motsvarande wrapper-klass - Unboxing: Wrapper-klass konverteras till motsvarande enkla datatyp Exempel: list.set(0, 28); //motsvarar list.set(0, new Integer(28)); 52
Klasser Loopa igenom en ArrayLista 1 public class ForEachLoop{ public static void main(string args[]) { ArrayList<Integer> array = for(integer i: array){ System.out.println(i); 53
Klasser Loopa igenom en ArrayLista 2 public class WhileIterator{ public static void main(string args[]) { ArrayList<Integer> array = ; Iterator<Integer> it = array.iterator(); while(it.hasnext()){ System.out.println(it.next()); 54
Skapa egna klasser 55
Exempel - Person public class Person{ // instance-variable private String name = ""; // constructor public Person(String name){ this.name = name; public synlig för alla private endast synlig för klassen 56
Exempel - Person public private name 57
Exempel - Person public class Person{ private String name = ""; // constructor public Person(String name){ this.name = name; // method public String getname(){ return name; 58
Exempel - Person public getname() private name 59
Exempel - Person Hur kan vi lägga till ålder? public class Person{ private String name = ""; public Person(String name){ this.name = name; public String getname(){ return name; 60
Exempel - Person public class Person{ private String name = ""; private int age = 0; public Person(String name, int age){ this.name = name; this.age = age; public String getname(){ return name; 61
Exempel - Person public getname() private name age 62
Exempel - Person Hur kan vi komma åt åldern? public class Person{ private String name = ""; private int age = 0; public Person(String name, int age){ this.name = name; this.age = age; public String getname(){ return name; 63
Exempel - Person public class Person{ private String name = ""; private int age = 0; public Person(String name, int age){ this.name = name; this.age = age; public String getname(){ return name; public int getage(){ return age; 64
Exempel - Person public getname() private name age getage() 65
Instansvariabler Instansvariabel variabel med ett värde för varje instans av en klass Exempel i klassen Person: private int name; private int age; 66
Inkapsling - Skydda variabler genom att man INTE tillåter att andra klasser kommer åt dem - Deklarera variabler som private: private String name = ""; - Använd getter/setter för att hämta värde/ändra på dem: get-metoder: getname() set-metoder: setname(string n) - Implementationen hålls gömd => - Lätt att ändra - Går att kontrollera värden (ex: tillåtna dagar i ett datum) 67
Klassvariabler Klassvariabler - unik variabel för klassen och finns tillgänglig för varje instans av klassen Alla instanser av klassen delar på klassvariablerna. Exempel: public static int adultage = 18; 68
Klassen Person public class Person{ public static int adultage = 18; private String name = ""; private int age = 0; public Person(String name, int age){ this.name = name; this.age = age;... 69
Exempel - Person public getname() private name age getage() adultage 70
Klassen Person Hur kan vi använda adultage? public class Person{ public static int adultage = 18; private String name = ""; private int age = 0; public Person(String name, int age){ this.name = name; this.age = age;... 71
Klassen Person Hur kan vi använda adultage? public class Person{ public static int adultage = 18; private String name = ""; private int age = 0; public Person(String name, int age){ this.name = name; this.age = age;... public boolean isadult() { return age >= Person.adultAge; 72
Exempel - Person public getname() private name age getage() isadult() adultage 73
Klassmetoder Klassmetod En metod som får använda klassvariabler men inte instansvariabler Exempel: public static int getadultage() { return Person.adultAge; 74
Klassen Person public class Person{ public static int adultage = 18; private String name = ""; private int age = 0; public Person(String name, int age){ this.name = name; this.age = age;... public static int getadultage() { return Person.adultAge; 75
Exempel - Person public getname() private name age getage() isadult() adultage getadultage() 76
UML Unified modeling Language - Verktyg för att uttrycka idéer Grafisk beskrivning av olika aspekter av objektorienterade system - Världsstandard - Vi kommer att använda klassdiagram Beskriver klasser och relationer mellan klasser 77
UML Klassnamn variabler metoder Person 78
UML Klassnamn variabler metoder Person +adultage: int - name: String - age: int 79
UML Klassnamn variabler metoder Person +adultage: int - name: String - age: int +getname(): String +getage(): int +isadult() : boolean +getadultage(): int 80
UML Person +adultage: int - name: String - age: int +getname(): String +getage(): int +isadult() : boolean +getadultage(): int Förklaring instansvariabel instansmetod klassvariabel klassmetod - privat +publik 81
UML relationer mellan klasser Association Klass 1 Klass 2 Arv subklass Association betyder att två klasser känner till varandra på något sätt. Kan specifieras ytterligare. 82
Mer om objektorientering Arv Abstrakta klasser Polymorfism Gränssnitt 83
Arv 84
Klassen Cat public class Cat{ private Person owner; private String name; public Cat(person myowner, String myname){ owner = myowner; name = myname; public String getinfo(){ return "Cat: " + name; Cat -owner: Person -name: String +getinfo(): String 85
Klassen Dog public class Dog{ private Person owner; private String name; public Dog(person myowner, String myname){ owner = myowner; name = myname; public String getinfo(){ return "Dog: " + name; Dog -owner: Person -name: String +getinfo(): String 86
Klassen Rabbit public class Rabbit{ private Person owner; private String name; private boolean incage; public Rabbit(Person myowner, String myname, boolean cage){ owner = myowner; name = myname; incage = cage; public String getinfo(){ return "Rabbit: " + name + " InCage: " + incage; Rabbit -owner: Person -name: String -incage: boolean +getinfo(): String 87
Klasserna samlade: Cat Dog Rabbit -owner: Person -name: String -owner: Person -name: String -owner: Person -name: String -incage: boolean +getinfo(): String +getinfo(): String +getinfo(): String 88
Använda klasserna public class ExampleWithoutInheritance{ public static void main(string args[]) { Person owner = new Person("Kalle", 20); Cat mycat = new Cat(owner, "MyCat"); Dog mydog = new Dog(owner, "MyDog"); Rabbit myrabbit = new Rabbit(owner, "MyRabbit", true); System.out.println("My name is " + owner.getname() + " and these are my pets:"); System.out.println(myCat.getInfo()); System.out.println(myDog.getInfo()); System.out.println(myRabbit.getInfo()); 89
Provkör!!! - Resultat My name is Kalle and these are my pets: Cat: MyCat Dog: MyDog Rabbit: MyRabbit incage: true 90
Arv Hur kan vi tala om att de är husdjur? Pet Cat Dog Rabbit -owner: Person -name: String -owner: Person -name: String -owner: Person -name: String -incage: boolean +getinfo(): String +getinfo(): String +getinfo(): String 91
Arv Vad har alla husdjur gemensamt? Pet Cat Dog Rabbit -owner: Person -name: String -owner: Person -name: String -owner: Person -name: String -incage: boolean +getinfo(): String +getinfo(): String +getinfo(): String 92
Arv Vad har alla husdjur gemensamt? Pet -owner: Person Cat Dog Rabbit -name: String -name: String -name: String -incage: boolean +getinfo(): String +getinfo(): String +getinfo(): String 93
Arv Vad har alla husdjur gemensamt? Pet -owner: Person -name: String Cat Dog Rabbit -incage: boolean +getinfo(): String +getinfo(): String +getinfo(): String 94
Arv Pet känner till Person Pet - owner: Person - name: String Person Cat Dog Rabbit -incage: boolean 95
Superklass och subklass Pet Superklass #owner: Person #name: String Cat Dog Rabbit -incage: boolean +getinfo(): String +getinfo(): String +getinfo(): String Subklass Subklass Subklass 96
Förra koden utan arv public class Cat{ private Person owner; private String name; public class Dog{ private Person owner; private String name; public class Rabbit{ private Person owner; private String name; private boolean incage; 97
Ny kod med arv public class Pet { protected Person owner; protected String name; public class Cat extends Pet{ public class Dog extends Pet{ public class Rabbit extends Pet{ private boolean incage; Nyckelordet extends används när man vill ärva från en annan klass. 98
Synlighet Samma klass paket subklass Alla klasser public X X X X protected X X X Inget (package) private X X X Vi kommer att gå igenom paket senare i kursen 99
Synlighet - UML Pet #owner: Person #name: String Förklaring - private # protected + public ~ package Cat Dog Rabbit -incage: boolean +getinfo(): String +getinfo(): String +getinfo(): String 100
Ny kod med arv Hur kan vi skapa konstruktorerna? public class Pet { protected Person owner; protected String name; public Pet(Person owner, String name){ this.owner = owner; this.name = name; public class Cat extends Pet{ public Cat(Person owner, String name){ super(owner, name); super() används för att anropa konstruktorn för klassen Pet 101
Ny kod med arv Hur kan vi skapa konstruktorerna? public class Dog extends Pet{ public Dog(Person owner, String name){ super(owner, name); public class Rabbit extends Pet{ private boolean incage; public Rabbit(Person owner, String name, boolean incage){ super(owner, name); this.incage = incage; super() används för att anropa konstruktorn för klassen Pet 102
Main-metoden public class ExampleWithInheritance{ public static void main(string args[]) { Person owner = new Person("Kalle", 20); Cat mycat = new Cat(owner, "MyCat"); Dog mydog = new Dog(owner, "MyDog"); Rabbit myrabbit = new Rabbit(owner, "MyRabbit", true); System.out.println("My name is " + owner.getname() + " and these are my pets:"); System.out.println(myCat.getInfo()); System.out.println(myDog.getInfo()); System.out.println(myRabbit.getInfo()); 103
Provkör!!! - Resultat My name is Kalle and these are my pets: Cat: MyCat Dog: MyDog Rabbit: MyRabbit incage: true 104
Arv - Fakta Arv Arv innebär att man skapar nya klasser genom att utgå från redan existerande klasser och utöka dem med ytterliggare instansvariabler och metoder. Exempel: Klassen Rabbit är en utökning av klassen Pet. 105
Arv - Fakta Superklass - Den klass man ärver från, till exempel klassen Pet. Subklass Den klass som ärvt från en superklass, Till exempel klasserna Cat, Dog och Rabbit Enkelt arv När klassen endast ärvt från en superklass Multipel arv När klassen ärvt från flera superklasser (Finns inte i JAVA) super() - används för att anropa superklassens konstruktor super.x() används för att komma åt metod x() i superklassen 106
Arv Varför? - Det blir lättare att göra ändringar i rätt klass. - Programmet blir lättare att underhålla och blir mer stabilt 107
Abstrakt klass 108
Main-metoden - alternativ public class ExampleWithInheritance{ public static void main(string args[]) { Person owner = new Person("Kalle", 20); Pet mycat = new Cat(owner, "MyCat"); Pet mydog = new Dog(owner, "MyDog"); Pet myrabbit = new Rabbit(owner, "MyRabbit", true); System.out.println("My name is " + owner.getname() + " and these are my pets:"); System.out.println(myCat.getInfo()); System.out.println(myDog.getInfo()); System.out.println(myRabbit.getInfo()); 109
Provkör!! - Resultat Problem: Pet does not have any method called getinfo(); Lösning: Lägg till metoden getinfo() i klassen Pet! Men, vad ska den göra för något? 110
Lösning 1 Lägg till getinfo() i Pet public class Pet { protected Person owner; protected String name; public Pet(Person owner, String name){ this.owner = owner; this.name = name; public String getinfo() { return "Pet:" + name; getinfo() kommer nog aldrig att anropas! 111
Lösning 2 Lägg till getinfo() i Pet public abstract class Pet { protected Person owner; protected String name; public Pet(Person owner, String name){ this.owner = owner; this.name = name; public abstract String getinfo(); Då en abstrakt klass kan innehålla en metod som inte är implementerad så kan man inte skapa en instans av den. Alla icke abstrakta klasser som ärver en abstrakt klass Måste implementera alla abstrakta metoder. 112
Synlighet - UML Pet #owner: Person #name: String Abstrakt klass Abstrakt metod - kursiv +getinfo(): String Cat Dog Rabbit -incage: boolean +getinfo(): String +getinfo(): String +getinfo(): String 113
Main-metoden - alternativ public class ExampleWithInheritance{ public static void main(string args[]) { Person owner = new Person("Kalle", 20); ArrayList<Pet> pets = new ArrayList<Pet>(); pets.add(new Cat(owner, "MyCat")); pets.add(new Dog(owner, "MyDog")); pets.add(new Rabbit(owner, "MyRabbit", true)); System.out.println("My name is " + owner.getname() + " and these are my pets:"); for(pet v: pets) { System.out.println(v); 114
Provkör!!! - Resultat My name is Kalle and these are my pets: Cat: MyCat Dog: MyDog Rabbit: MyRabbit incage: true 115
Abstrakta klasser - Fakta Abstrakta klasser En klass som har minst en metod som inte är implementerad. Abstrakt metod En metod som finns i en abstrakt klass men som saknar implementering. - Man kan inte skapa en instans av en abstrakt klass - När man ärver en abstrakt klass måste man alltid implementera de abstrakta metoderna. 116
Polymorfism - Fakta Polymorfism (mångformiget) Möjligheten att kunna skapa objekt som har mer än en form. Objekten härstammar från en superklass och har liknande egenskaper. Exempel: Pet mycat = new Cat(owner, "MyCat"); Pet mydog = new Dog(owner, "MyDog"); Även om objektet är deklarerad med en superklass så anropas metoden som finns i subklassen: Exempel: // här anropas getinfo() i Cat // istället för den i Pet mycat.getinfo(); 117
Hur kan vi byta ägare på ett husdjur? public Class Pet { protected Person owner; protected String name; public void transferownership(person newowner) { owner = newowner; public String getownername() { return owner.getname(); public class Cat extends Pet{... 118
Main-metod public class ExampleWithTransferOwner{ public static void main(string args[]) { Person owner = new Person("Kalle", 20); Pet mycat = new Cat(owner, "MyCat"); Pet mydog = new Dog(owner, "MyDog"); System.out.println(myCat.getOwnerName() + " owns the cat."); System.out.println(myDog.ogetOwnerName() + " owns the dog."); 119
Main-metod System.out.println("Stina buys the cat from " + mycat.getownername() + "."); mycat.transferownership (new Person("Stina",18)); System.out.println(""); System.out.println(myCat.getOwnerName() + " owns the cat."); System.out.println(myDog.ogetOwnerName() + " owns the dog."); 120
Provkör!!! - Resultat Kalle owns the cat. Kalle owns the dog. Stina buys the cat from Kalle. Stina owns the cat. Kalle owns the dog. 121
Arv Vad ser vad? #owner: Person #name: String Pet +transferownership(newowner: Person) +getowner(): String +getinfo(): String Cat Dog Rabbit -incage: boolean +getinfo():string +getinfo():string +getinfo():string Klassen Pet ser endast sig själv! 122
Arv Vad ser vad? #owner: Person #name: String Pet +transferownership(newowner: Person) +getowner(): String +getinfo(): String Cat +getinfo():string Dog +getinfo():string Rabbit -incage: boolean +getinfo():string Klassen Cat ser både sig själv och Pet!! 123
Arv Vad ser vad? #owner: Person #name: String Pet +transferownership(newowner: Person) +getowner(): String +getinfo(): String Cat +getinfo():string Dog +getinfo():string Rabbit -incage: boolean +getinfo():string Klassen Dog ser både sig själv och Pet!! 124
Arv Vad ser vad? #owner: Person #name: String Pet +transferownership(newowner: Person) +getowner(): String +getinfo(): String Cat +getinfo():string Dog +getinfo():string Rabbit -incage: boolean +getinfo():string Klassen Rabbit ser både sig själv och Pet!! 125
Arv - Fakta En klass kan bara se sig själv och de klasser den ärvt från. Exempel: - Superklassen Pet kan bara se Pet - Subklassen Cat kan se både Cat och superklassen Pet - Subklassen Dog kan se både Dog och superklassen Pet - Subklassen Rabbit kan se både Rabbit och superklassen Pet 126
Kan vi kategorisera klasserna ytterliggare? #owner: Person #name: String Pet +transferownership(newowner: Person) +getowner(): String +getinfo(): String Cat +getinfo():string Dog +getinfo():string Rabbit -incage: boolean +getinfo():string 127
Kan vi kategorisera klasserna ytterliggare? #owner: Person #name: String Pet +transferownership(newowner: Person) +getowner(): String +getinfo(): String Cat Dog Rabbit -incage: boolean +getinfo():string +getinfo():string Katter och hundar är rovdjur! +getinfo():string 128
Vad ser vad nu? #owner: Person #name: String Pet +transferownership(newowner: Person) +getowner(): String +getinfo(): String Predator #hasprey: boolean Cat Dog Rabbit -incage: boolean +getinfo():string +getinfo():string +getinfo():string 129 Katter och hundar är rovdjur! Vi skapar klassen Predator!
Vad ser vad nu? #owner: Person #name: String Pet +transferownership(newowner: Person) +getowner(): String +getinfo(): String Predator #hasprey: boolean Cat Dog Rabbit -incage: boolean +getinfo():string +getinfo():string Vad ser klassen Predator? +getinfo():string 130
Vad ser vad nu? #owner: Person #name: String Pet +transferownership(newowner: Person) +getowner(): String +getinfo(): String Predator #hasprey: boolean Cat Dog Rabbit -incage: boolean +getinfo():string +getinfo():string +getinfo():string Vad ser klassen Predator? Klasserna Predator och Pet 131
Vad ser vad nu? #owner: Person #name: String Pet +transferownership(newowner: Person) +getowner(): String +getinfo(): String Predator #hasprey: boolean Cat Dog Rabbit -incage: boolean +getinfo():string Vad ser klassen Cat? +getinfo():string +getinfo():string 132
Vad ser vad nu? #owner: Person #name: String Pet +transferownership(newowner: Person) +getowner(): String +getinfo(): String Predator #hasprey: boolean Cat Dog Rabbit -incage: boolean +getinfo():string +getinfo():string +getinfo():string Vad ser klassen Cat? Klasserna Cat, Predator och Pet 133
Vad ser vad nu? Pet #owner: Person #name: String +transferownership(newowner: Person) +getowner(): String +getinfo(): String Predator #hasprey: boolean Cat Dog Rabbit -incage: boolean +getinfo():string Vad ser klassen Dog? +getinfo():string +getinfo():string 134
Vad ser vad nu? #owner: Person #name: String Pet +transferownership(newowner: Person) +getowner(): String +getinfo(): String Predator #hasprey: boolean Cat Dog Rabbit -incage: boolean +getinfo():string +getinfo():string +getinfo():string 135 Vad ser klassen Dog? Klasserna Dog, Predator och Pet
Vad ser vad nu? #owner: Person #name: String Pet +transferownership(newowner: Person) +getowner(): String +getinfo(): String Predator #hasprey: boolean Cat +getinfo():string Dog +getinfo():string Rabbit -incage: boolean +getinfo():string Vad ser klassen Rabbit? 136
Vad ser vad nu? #owner: Person #name: String Pet +transferownership(newowner: Person) +getowner(): String +getinfo(): String Predator #hasprey: boolean Cat +getinfo():string Dog +getinfo():string Rabbit -incage: boolean +getinfo():string Vad ser klassen Rabbit? Klasserna Pet och Rabbit 137
Gammal kod public class Cat extends Pet{ public Cat(Person myowner, String myname){ super(myowner, myname); public class Dog extends Pet{ public Dog(Person myowner, String myname){ super(myowner, myname); 138
Ny kod public class Predator extends Pet{ protected boolean hasprey = false; public Predator(Person myowner, String myname){ super(myowner, myname); public class Cat extends Predator{ public Cat(Person myowner, String myname){ super(myowner, myname); public class Dog extends Predator{ public Dog(Person myowner, String myname){ super(myowner, myname); 139
Ny main public class ExampleWithInheritance{ public static void main(string args[]) { Person owner = new Person("Kalle", 20); ArrayList<Pet> pets = new ArrayList<Pet>(); pets.add(new Cat(owner, "MyCat")); pets.add(new Dog(owner, "MyDog")); pets.add(new Rabbit(owner, "MyRabbit", true)); System.out.println("My name is " + owner.getname() + " and these are my pets:"); for(pet v: pets) { System.out.println(v); 140
Provkör!!! - Resultat My name is Kalle and these are my pets: Cat: MyCat Dog: MyDog Rabbit: MyRabbit incage: true 141
Gränssnitt 142
Gränssnitt Fakta Ett gränssnitt defininerar ett gränssnitt (eller en mall) och får INTE innehålla kod. Exempel: public interface PetInterface{ public void print();... 143
Gränssnitt Fakta Ett gränssnitt kan INTE ärvas. class Cat extends PetInterface{ void print() {... class Dog extends PetInterface{ void print() {... class Rabbit extends PetInterface{ void print() {... 144
Gränssnitt Fakta Ett gränssnitt MÅSTE implementeras. Exempel: class Cat implements PetInterface{ void print() {... class Dog implements PetInterface{ void print() {... class Rabbit implements PetInterface{ void print() {... 145
Klasserna samlade: PetInterface print() Cat -owner: Person -name: String Dog -owner: Person -name: String Rabbit -owner: Person -name: String -incage: boolean 146
Ny Main-metod public class ExampleInterface{ public static void main(string args[]) { Person owner = new Person("Kalle", 20); PetInterface[] pets = new PetInterface[3]; pets[0] = (PetInterface) new Cat(owner, "MyCat"); pets[1] = (PetInterface) new Dog(owner, "MyDog"); pets[2] = (PetInterface) new Rabbit(owner, "Rabbit", true); for(int i = 0; i < pets.length; i++) pets[i].print(); 147
Provkör!!! - Resultat Cat: MyCat Dog: MyDog Rabbit: MyRabbit incage: true 148
Gränssnitt - Fakta Casting innebär att man konverterar från ett objekt till ett annat. Exempel: pets[0] = (PetInterface) new Cat(owner, "MyCat"); Detta fungerar eftersom klassen Cat har implementerat gränssnittet PetInterface. 149
Gränssnitt - Fakta En klass kan implementera ett gränssnitt men inte ärva den. En klass kan endast ärva en klass men kan implementera flera gränssnitt. Exempel: class X implements interface1, interface2 { 150
Laboration 0 - Övning på objektorienterad programmering - Implementera ett litet objektorientar program om fordon, steg för steg - Frågor efter varje steg samt i slutet, som man bör kunna svara på: Frågorna är även relevanta inför tentan - Ingen redovisning, men materialet är relevant för resten av kursen! - Fråga gärna om ni är osäkra på något! 151
Arbeta själv under veckan - Gör färdigt laboration 0 - Gör programmeringsövningar Repetition: Eck kap 1-4 Objektorientering: Eck kap 5 - Repetera från tidigare kurser Reguljära uttryck och automater Grundläggande programmering Läs på inför nästa vecka Reguljära uttryck (se hemsida för material) Hashtabeller, Eck kap 10.3-4 152
Nästa vecka - Tema: Reguljära uttryck --- Fokus: hur de används i Java Hashtabeller Läsning/skrivning - Föreläsning - Laboration 1: Applicera ovanstående på språkteknologiska problem 153