Forelæsning Uge 1 Torsdag Objekters tilstand og opførsel Java og BlueJ Skabelse af objekter (via new-operatoren) Iteration (gentagelser) og parametrisering Java's for løkke Parametre i metoder Forskellige slags variabler Feltvariabler Lokale variabler
Objekters tilstand og opførsel i Java Tilstand Objekters tilstand er defineret ved et sæt af feltvariabler (fields) Feltvariablerne er fastlagt i klassens erklæring Alle objekter (af en given klasse) har de samme feltvariabler Hvert objekt har sin egen tilstand (værdier af feltvariabler) Opførsel Objekters opførsel er defineret ved et sæt konstruktører og metoder Konstruktører og metoder er fastlagt i klassens erklæring Alle objekter (af en given klasse) har de samme konstruktører og metoder 2
Objekters tilstand i Java public class Person { private String name; private int age; public Person(String n, int a) { name = n; age = a; public String getname() { return name; Tilstand beskrives ved hjælp af feltvariabler Navn Type Access modifier (private) public void setname(string n) { name = n; public int getage() { return age; public void birthday() { age= age + 1; System.out.println("Happy birthday " + name + "!"); 3
Objekters opførsel i Java public class Person { private String name; private int age; public Person(String n, int a) { name = n; age = a; public String getname() { return name; public void setname(string n) { name = n; Opførsel beskrives ved hjælp af Konstruktører Metoder Accessor (get) Mutator (set) public int getage() { return age; public void birthday() { age = age + 1; System.out.println("Happy birthday " + name + "!"); 4
Hoved for konstruktører og metoder public class Person { private String name; private int age; public Person(String n, int a) { name = n; age = a; public String getname() { return name; public void setname(string n) { name = n; public int getage() { return age; Navn Konstruktører: klassens navn Parameterliste Kan være tom: () Returtype Kan være tom: void Konstruktører: mangler Access modifier (public) Navn + parametrenes typer = signatur Signaturen bestemmes af hovedet Returtypen indgår ikke i signaturen public void birthday() { age= age + 1; System.out.println("Happy birthday " + name + "!"); 5
Feltvariabler, konstruktører og metoder public class Person { private String name; private int age; public Person(String n, int a) {... Feltvariabler (attributter) bestemmer objektets tilstand erklæres altid private kan kun tilgås fra klassens egne konstruktører og metoder (vedkommer ikke andre) public int getage() {... public void birthday() {... Konstruktører og metoder bestemmer objektets opførsel grænseflade til omverdenen erklæres oftest public kan kaldes fra objekter af alle klasser 6
Klasser og typer Enhver klasse bestemmer en type En objekt type er en type, der er bestemt via en klasse De mulige værdier i typen er de objekter, der kan skabes (instansieres) af den pågældende klasse Person og String klasserne er eksempler på objekt typer Navne på objekt typer (klasser) skrives med stort begyndelsesbogstav (Person og String) Primitive typer Har simple værdier, der ikke er objekter Eksempler: heltal (int), reelle tal (double) og sandhedsværdier (boolean) Navne på primitive typer skrives med lille begyndelsesbogstav (int, double og boolean) 7
Objekters tilstand og opførsel i BlueJ person1 "Peter" 24 n personens navn a personens alder n skal have typen String a skal have typen int 8
Lad os lave endnu et Person objekt person2 "Anna" 18 De to objekter har de samme feltvariabler, men med forskellige værdier 9
Lad os højreklikke på person2 10
Kald af metoden getage (accessor) 11
Kald af metoden setname (mutator) "Maria" 12
Kald af metoden birthday (mutator) 13
Kald af metoden isteenager (accessor) 14
Lad os kalde metoden birthday igen 15
Lad os kalde metoden isteenager igen 16
Java kode for Person klassen 17
Skabelse af objekter (new operator) public class Person { private String name; private int age; private boolean female; private Person father; public Person(String n, int a, boolean sex) { name = n; age = a; female = sex;... Nu med 4 feltvariabler private Person p1; p1 = new Person("Susan", 42, true); p1:person name age Person 42 0 String "Susan" female false true father 18
Endnu et objekt private Person p2; p2 = new Person("Peter", 69, false); p2:person name age Person 69 0 String "Peter" For feltvariabler af primitiv type repræsenteres værdien direkte i objektet (f.eks. age og female) p1:person female false father Person name age 42 For feltvariabler af objekt type repræsenteres værdien via en reference til det pågældende objekt (f.eks. name og father) String "Susan" female true father 19
Metoden setfather (mutator) p1.setfather(p2); public void setfather(person p) { father = p; p2:person name age Person 69 String "Peter" female father false UML Objektdiagram OPFØRSEL (dynamisk) p1:person name age Person 42 String "Susan" female true father 20
Metoden birthday (mutator) p1.birthday(); public void birthday() { age = age + 1; System.out.println( "Happy birthday " + name + "!" ); Kald af metode i Java s klassebibliotek (udskriver linje på BueJ's terminal) Sammensætning af tekststrenge (konkatenering) p1:person name age Person 42 43 String "Susan" female true father 21
Én person to referencer private Person p1, p2; p1 = new Person("Susan", 42, true); p2 = p1; p1.birthday(); p2.birthday(); p2:person p1:person name age Person 43 42 44 String "Susan" female true father 22
To personer én reference private Person p1; p1 = new Person("Susan", 42, true); p1 = new Person("Peter", 69, false); p1.birthday(); name age Person 70 69 String "Peter" female false father p1:person name age Person 42 String "Susan" female father true Vi kan ikke længere bruge dette objekt (ingen referencer til det) 23
Iteration og parametrisering Skildpadden kan dirigeres rundt på et lærred Den tegner en streg, hvor den kommer frem (hvis pennen er nede) Stregens farve kan skifte undervejs Skildpaddens tilstand Position: (x, y) Vinkel: 270 180 0 (360) (0,0) 90 Farve::... Pen status: up/down Lærred Skildpadde (600,600) Eksempel på tilstand ((350, 300), 0, blue", down) 24
Programmering af skildpadden Vi antager, at Turtle klassen stiller en række simple metoder (tegneoperationer) til rådighed Flyt, drej, pen op/ned,... Dem vil vi supplere med nogle mere komplekse metoder Kvadrat, polygon, cirkel, Turtle move(double distance) turn(double degrees) penup() pendown()... square(double size) polygon(int n, double size) circle(double radius)... Typen double repræsenterer reelle tal Alle steder, hvor I skal bruge en double kan I i stedet bruge en int Det omvendte gælder ikke Hvis I vil indtaste et reelt tal indsættes et punktum 360.0 er af typen double, mens 360 er af typen int 25
Gentagelser af kode // Tegn kvadrat move(100); turn(90); move(100); turn(90); move(100); turn(90); move(100); turn(90); // Tegn kvadrat gentag 4 gange { move(100); turn(90); // Tegn tolvkant move(100); turn(30); move(100); turn(30); move(100); turn(30); move(100); turn(30); move(100); turn(30); move(100); turn(30); move(100); turn(30); move(100); turn(30);... move(100); turn(30); // Tegn tolvkant gentag 12 gange { move(100); turn(30); Hurtigere at skrive Nemmere at læse og forstå Lettere at vedligeholde (rette i) 26
for løkke i Java Start ERKLÆRING + INITIALISERING Lokal variable i af type int med startværdi 0 TEST (boolsk udtryk) Falsk Sand Keyword (reserveret ord) KROP (de ting, der skal gentages) move(100); turn(90); for( int i=0 ; i<4 ; i++ ) { move(100); turn(90); OPDATERING i++ i = i+1 27
Metode: kvadrat med længde 100 public class Turtle {... // Tegn kvadrat med sidelængde 100 public void square100() { for( int i = 0; i < 4; i++ ) { move( 100 ); Længden 100 indsat direkte i metoden... turn( 90 ); I stedet kunne vi angive længden ved hjælp af en parameter Det ville være smartere at lave en metode, der kan tegne kvadrater af vilkårlig størrelse 28
Metode: kvadrat med vilkårlig størrelse public class Turtle {... // Tegn kvadrat med sidelængde size public void square(double size ) { for( int i = 0; i < 4; i++ ) { move( size ); Parameter i square turn(90); Argument til move... Det ville være smartere at lave en metode, der kan tegne regulære figurer med et vilkårligt antal sider 29
Metode: polygon med vilkårligt antal sider public class Turtle {... // Tegn regulær n-kant med sidelængde size public void polygon(int n, double size) { for( int i = 0; i < n; i++ ) { move( size ); turn( 360.0 / n); Reelt tal 30
Generel metode specifikke metoder Vi kan benytte den generelle metode polygon til at konstruere mere specifikke metoder, der kan tegne kvadrater og cirkler. public class Turtle {... // Tegn regulær n-kant med sidelængde size public void polygon(int n, double size) {... // Tegn kvadrat med sidelængde size public void square(double size) { polygon(4, size); // Tegn cirkel med den angiven radius public void circle(double radius) { polygon(100, 2 * radius * Math.PI / 100)); Konstanten (fra klassen Math) 31
Vigtige principper for god programmering Det kan betale sig at lave gode generelle metoder, som kan genbruges i mange situationer Parametrisering er nøglen hertil Det er svært at "opfinde" gode generelle metoder, dvs. at gå fra det konkrete til det generelle men forsøg! Skeln mellem anvendelse og implementation Når man anvender en metode, er det vigtigt at forstå, hvad operationen gør Når man implementerer en metode, skal man tage stilling til, hvordan den skal gøre det I skal også skelne selv om I både er anvender og implementør 32
Forskellige slags variabler Klasser har feltvariabler Tilhører objektet Lever og dør med dette Bruges til værdier der skal gemmes mellem metodekald private som access modifier public class Turtle { private String color;... public void polygon( int n, double size ) { double angle = 360.0 / n; for( int i = 0; i < n; i++ ) { move(size); turn(angle);... 33
Forskellige slags variabler (fortsat) Metoder og konstruktører har lokale variabler Tilhører metoden/konstruktøren Lever og dør med det enkelte kald af metoden/konstruktøren Kan ikke bruges til at gemme resultater mellem metodekald Ingen access modifier (kan aldrig tilgås udenfor metoden/konstruktøren) public class Turtle { private String color;... public void polygon( int n, double size ) { double angle = 360.0 / n; Parametre for( int i = 0; i < n; i++ ) { Hjælpevariabel move(size); Løkkevariabel turn(angle);... 34
Opsummering Objekters tilstand og opførsel Java og BlueJ Skabelse af objekter (via new-operatoren) Objekt referencer Iteration (gentagelser) Java's for løkke Parametrisering Lav gode generelle metoder Skeln mellem anvendelse og implementation Forskellige slags variabler Feltvariabler Lokale variabler 35
Objektorienteret programmering I objektorienteret programmering benyttes metaforer fra dagligdagen Et program er en model, der simulerer (beskriver) opførslen af en del af verden (reel eller imaginær) OO-modellering beskriver virkeligheden ved hjælp af: Klasser modellerer begreber (f.eks. Menneske) Objekter er instanser af klasser (fx. Peter Hansen, Anne Petersen,.) Ovenstående definitioner stammer fra sproget Simula 67 og er dermed 50 år gamle Kristen Nygaard (1926-2002) grundlægger af objektorienteret modellering og programmering (sammen med Ole-Johan Dahl) gæsteprofessor på Aarhus Universitet i en årrække, hvor han havde stor betydning for opbygningen af datalogi Nygaard-bygningen i IT-parken er opkaldt efter Kristen 36
Studiestartsprøve Gælder alle nye bachelorstuderende Prøvens hovedformål er at identificere de studerende, der ikke har påbegyndt studiet, så de kan udmeldes inden det officielle sommeroptag opgøres Mandag den 4. september 2017 vil I modtage en mail på jeres aumailadresse Mailen indeholder et link til et spørgeskema, som I skal besvare Det er obligatorisk at gennemføre studiestartsprøven, da den bruges til at registrere, om I er studieaktive I skal besvare spørgeskemaet i løbet af få dage ellers bliver I udmeldt af studiet 37
CS Challenge Henvender sig til alle 1. års studerende, der følger den introducerende datalogiundervisning Det er et tilbud, og derfor på ingen måde obligatorisk Der stilles fem sjove udfordringer inden for programmering De skal løses hen over efteråret (første aflevering 17. september) Hver udfordring illustrerer universelle principper om algoritmer og programmer Det handler mere om at tænke end at knokle Deltagerne får detaljeret feedback på deres løsninger CS Challenge kan tælle med i talentforløb Ekstra udfordringer til særligt talentfulde studerende Anerkendelse herfor på eksamensbevis Søges ved starten af 2. studieår Kræver karaktergennemsnit på 10 fra 1.studieår Mere information: cs.au.dk/challenge http://cs.au.dk/challenge/ 38
Husk at forberede jer til øvelserne Ved øvelserne i Uge 2 skal I beskæftige jer med opgaverne i kapitel 2 og 3 i BlueJ bogen Opgaverne skal løses, mens I læser kapitlerne Ved øvelserne vil instruktorerne så tage fat i de opgaver, hvor I har problemer Der vil selvfølgelig også være muligt at få hjælp til tvivlsspørgsmål i kapitlernes tekst Derudover skal I (ved anden øvelsesgang) arbejde videre med raflebæger projektet Nu skal I lave nogle metoder til aftestning af raflebægeret Derudover skal I generalisere løsningen, således at en terning kan have et vilkårligt antal sider (større end eller lig med 2) 39
Det var alt for nu.. spørgsmål 40