Kursus i OOP og Java
|
|
|
- Line Lauritzen
- 9 år siden
- Visninger:
Transkript
1 Kursus i OOP og Java Sidst opdateret 24. november 2001 kun afpudset t.o.m lektion 12 Indholdsfortegnelse Kursus i OOP og Java 1 Til underviseren 5 Om transparenterne 5 Om ugesedlerne 5 Lektion 1 6 Mål med lektion 1 6 Praktisk 7 Hvad er et program? 8 Et Javaprogram: Pandekagedej vha. en robot 9 Når computeren skal gøre komplicerede ting 10 Hvad er et Javaprogram 11 Sproget Javas regler 12 Hvordan køres et javaprogram 13 Programmørens arbejdsgang 14 Udviklingsværktøjet (JBuilder) 14 Projekter 15 Øvelserne 16 Opsamling 17 Lektion 2 18 Praktisk 18 Mål med lektion 2 18 Resumé 19 Betinget udførelse 19 while løkken 20 for løkken 20 De simple typer 21 Model for udregninger, før kørsel 22 Model for udregninger under kørsel 22 Hvordan bliver et program til? 23 For projekt 24 Opsamling 25 Lektion 3 26 En løsning på kurveprogrammet 27 Udvidelser: 28 Resumé af objekter og klasser 29 Quiz: Punkter 29 Løsning 30 Klassen String 31 Klassen Vector 32 Appletter 35 Lektion 4 36 Praktisk 36 Fra UML klassediagram til Java 37 Prøv at lave din egen klasse 38 Metodekroppen af translate() 39
2 Metodekroppen af distance() 39 DoublePoints Konstruktører 40 Inspiration til for projekt: Polynomier 41 Næste trin 42 Klasser 43 Lektion 5 44 Praktisk 44 Egne klasser og objekter 45 Klassen Terning 46 Formen af klasser 47 Formen af en metode 48 Metodehovedet 48 Metodekroppen 48 Relationer mellem egne klasser 49 Nøgleordet this 51 Test dig selv kapitel 3 og 4 52 For projektet 52 Husk når I laver jeres program: 52 Hvem skal tegne polynomiet? 53 Tænk også over: 53 Lektion 6 54 Introduktion til nedarvning 55 At udbygge med flere metoder og variabler 57 Introduktion til polymorfi 58 Nedarvnings hierakier 59 Ide til forprojekt: 59 Trinvis gennemgang med JBuilder 60 Lektion 7 62 Praktisk 62 I dag: Udveksling af forprojekterne 63 Næste gang: Gennemsyn af forprojekter 63 Resume arv 64 super 64 Polymorfi 65 Alting arver fra Object 66 Konstruktører skal defineres på ny i en nedarving 67 Nedarvning i graf tegningsprogrammet 68 Lektion 8 69 Test dig selv 69 Appletter 70 HTML dokumentet 70 Java koden 70 Metoder som du kan kalde 71 Metoder som fremviseren kalder 71 Generering af grafiske brugergrænseflader 72 Udviklingsværktøjer 75 Applikationer 76 Grafiske komponenter 77 FlowLayout 77 BorderLayout 77 GridBagLayout 77 Java Examples in a Nutshell, kapitel Hændelser 79 Lektion 9 80 Praktisk 80 Næste gang: Obligatorisk opgave 80
3 Løsning til Matador opgave 81 Undtagelser og stakspor 84 Undtagelser kan fanges og behandles 85 Syntaks: 85 Præcis håndtering af undtagelser med try catch inde i while løkken: 87 JDBC databaseadgang 88 Kommandoer 88 Forespørgsler 88 Indkapsling og abstaktion pak det ind i en klasse for sig 89 Lektion Objektorienteret analyse 93 Skrive vigtige ord op 93 Brugsmønstre 93 Aktivitetsdiagrammer 94 Skærmbilleder 95 Objektorienteret design 96 Kollaborationsdiagrammer 96 Klassediagrammer kan tegnes med et UML værktøj 97 Virkefelt 99 Demo:Grafiske programmer med JBuilder 100 StregApplet 102 TegnePlade 104 Lektion Interface 105 Implementere et interface 106 Variabler 106 Flere eksempler med Tegnbar interfacet 107 Polymorfi 107 En applet af tegnbare objekter 108 Interfaces i standardbibliotekerne. 109 Serialisering 110 Netværkskommunikation 112 En klient (der henter en hjemmeside) 113 En vært, der "serverer" hjemmesider 114 Flertrådet programmering 115 En flertrådet webserver 115 Lektion Hændelser 120 Linietegning 122 Tekstredigering 123 JBuilder 124 Arrays 125 Initialisering med startværdier 126 Arrays af objekter 126 Lokale, objekt og klassevariable 127 Tilknytning 128 Adgang til variabler og metoder 129 Adgang fra metoder 129 Lektion Lektion public, protected og private 132 Nøgleordet final 133 Nøgleordet abstract 134 Klasser 134 Metoder 134 Indre klasser 136
4 Almindelige indre klasser 136 Eksempel Linietegning 137 Lokale klasser 137 Anonyme klasser 140 Eksempel filtrering af filnavne 141 Eksempel Linietegning 142 Eksempel tråde 143
5 Til underviseren Om transparenterne Dette dokument indeholder transparenter til et aftenkursus i OOP og Java på IT Diplomuddannelsen. Det er inddelt i 15 lektioner og følger den foreslåede lektionsplan. Jeg har valgt at udgive dem som et samlet dokument (til Word og StarOffice Writer) fordi det gør dem nemmere at tilrette til andre undervisningsforløb. Alt i dette dokument må således frit mangfoldiggøres og tilrettes efter behov (det kunne f.eks. være at der blev brugt et andet udviklingsmiljø end JBuilder). Visse dele er direkte udklip fra bogen. Er der andre dele eller figurer fra bogen du kunne tænke dig at få med i dine præsentationer så skriv til mig: [email protected]. Transparenterne bærer naturligvis præg af min undervisningsstil som blandt andet forudsætter at eleverne selv læser stoffet, så det er kun nødvendigt at gennemgå centrale pointer i timerne. Har du lavet nogle gode præsentationer og undervisningsmateriale som du tror andre kunne få glæde af så modtager jeg dem gerne og lægger dem på bogens hjemmeside (dette gælder også præsentationer på dansk der gør brug af andre bøger). Visse steder kan der være problemer med Word dokumentet. Det skyldes at det hele er skrevet i StarOffice, da Microsoft sjovt nok ikke har udgivet Word til Linux (og jeg sjovt nok aldrig har syntes en Windows licens var pengene værd : ). I så fald kan dokumentet redigeres med StarOffice, der kan hentes gratis på Om ugesedlerne Der er flere øvelser til hver uge end eleverne kan nå at lave til timerne. Underviseren kan vælge om eleverne så skal forsøge at lave dem hjemme, om de er valgfrie eller om nogle af dem skal stryges. Jacob Nordfalk.
6 Lektion Praktiske forhold Forelæsning: Hvad er et program? Pause Forelæsning: Brug af JBuilder Øvelser Opsamling m.m Farvel og tak Mål med lektion 1 basal forståelse for hvad et program er lære at bruge JBuilder, så I kan komme i gang med at programmere
7 Praktisk Har alle e post? Litteratur på kurset: J. Nordfalk: "Objektorienteret programmering i Java" (dele af den kan læses på ) Udleverede transparenter Hvor mange har læst? Navnerunde Bare spørg løs Hvad kommer til at foregå på skolen Gentager ikke hvad der står i bogen Emner behandles på opfordring Målet med kurset Lære at programmere Lære at programmere objektorienteret Lære programmeringssproget Java Optakt til senere fag, f.eks OOAD
8 Hvad er et program? Pandekager 800 g mel 4 tsk sukker 1 tsk salt 12 æg 16 dl mælk 12 spsk vand 1.Hæld mælk i en skål 2.Hæld vand i skålen 3.Tilsæt salt 4.Tilsæt sukker 5.Så længe der er æg tilbage: 1.Tag et æg 2.Slå ægget i stykker 3.Put ægget i skålen 6.Tilsæt mel 7.Rør dejen Instruktionerne udføres en ad gangen, oppefra og ned.
9 Et Javaprogram: Pandekagedej vha. en robot... double kilomel = 0.8; int tsksukker = 4; int tsksalt = 1; int antalæg = 12; int dlmælk = 16; int spskvand = 12;... KokkeRobot.hældMælkISkål(dlMælk); KokkeRobot.hældVandISkål(spskVand); KokkeRobot.putSaltISkål(tskSalt); KokkeRobot.putSukkerISkål(tskSukker); Variabler skal erklæres før de må bruges Programmet udføres sekventielt (oppe fra og ned)
10 Når computeren skal gøre komplicerede ting... KokkeRobot.putSukkerISkål(tskSukker); while (antalæg > 0) antalæg = antalæg 1; KokkeRobot.slåÆggetIstykker(); KokkeRobot.put1ÆgISkål();... KokkeRobot.putMelISkål(kiloMel); KokkeRobot.rørDejen(); Foretager valg ud fra simple logiske udsagn Simple byggeklodser til at vælge handlinger putsukkeriskål() antalæg>0? nej ja Træk 1 fra antalæg slåægistykker() putægiskål() putmeliskål() rørdej() while sætningen udfører en blok af kommandoer indtil udsagnet er falskt. Derefter fortsættes programmet if sætning udfører kun kommandoerne, hvis udsagnet er sandt
11 Hvad er et Javaprogram Fil med endelsen.java kildekoden har en strukturdel: public class Pandekager public static void main(string[] arg)... og noget indhold en kogebogsopskrift kommandoer der skal udføres:... KokkeRobot.hældMælkISkål(dlMælk); KokkeRobot.hældVandISkål(spskVand); KokkeRobot.putSaltISkål(tskSalt); KokkeRobot.putSukkerISkål(tskSukker);...
12 Til sammen en hel java fil: public class Pandekager public static void main(string[] args) double kilomel = 0.8; int tsksukker = 4; int tsksalt = 1; int antalæg = 12; int dlmælk = 16; int spskvand = 12; KokkeRobot.hældMælkISkål(dlMælk); KokkeRobot.hældVandISkål(spskVand); KokkeRobot.putSaltISkål(tskSalt); KokkeRobot.putSukkerISkål(tskSukker); while (antalæg > 0) antalæg = antalæg 1; KokkeRobot.slåÆggetIstykker(); KokkeRobot.put1ÆgISkål(); KokkeRobot.putMelISkål(kiloMel); KokkeRobot.rørDejen(); Sproget Javas regler Struktur: Noget kan indeholde noget andet en klasse kan indeholde en main metode en metode kan indeholde sætninger (kommandoer) Hver sætning skal ses isoleret... KokkeRobot.hældMælkISkål(dlMælk); KokkeRobot.hældVandISkål(spskVand);...
13 Hvordan køres et javaprogram public class Program public void main(...)... fil: Program.java oversæt fil: Program.class kør Hej Verden! Hvornår smager en Tuborg bedst? Hvergang! skærm : Uddata fra programmet
14 Programmørens arbejdsgang skriv kode kør oversæt ret fejl Udviklingsværktøjet (JBuilder) rette i programmer oversætte java filer køre javaprogrammer finde fejl (bl.a. med trinvis gennemgang af programmer)
15 Projekter et projekt organiserer filer der hører sammen hvert program i sit projekt selvom programmerne er små holder rede på egenskaber for programmet ikke det samme som et katalog projekter ligger ofte i C:\Jbproject MitProjekt MitProjekt.jpr ;JBuilder PROJECT FILE VERSION 2.00 do not alter this line! #0=MitProjekt.jpr #1=src\MitProgram.java jbuilder.debug[0].notracingclasses.1=,java.*,1... jbuilder.debug[0].notracingclasses.6=,com.borland.sql,1 jbuilder.debug[0].notracingclasses.7=,com.borland.dbswing,1 jbuilder.debug[0].notracingclasses.8=,com.borland.datastore,1 jbuilder.debug[0].notracingclasses.9=,com.borland.dx,1 runtime.0[0].application.class=program.java sys[0].author=x sys[0].classpath= sys[0].company=x src Program.java class Program.class
16 Øvelserne JBuilder skal registreres: Skriv jeres navn og tryk add.. og indtast serienummeret. Sæt jer 2 og 2 ved maskinerne Senere 1 og 1 Snak gerne med naboen... han har måske lige løst det problem du sidder med
17 Opsamling læs hjemme: resten af kapitel 2, undtagen Avanceret noter afsnit, der er svære at forstå noter tidsforbrug brug Test dig selv installer JBuilder prøv eksemplerne fra kapitel 2 problemer: skriv per e post
18 Lektion Resumé af stoffet Praktiske oplysninger og spørgsmål Model for beregninger Pause Hvordan bliver et program til? Introduktion til for projekt Individuelle øvelser ved maskinerne Opsamling og evaluering af løsninger Lidt om det rigtige projekt Praktisk Spørgsmål til kapitel 1 og 2 Hvem har læst? Hvem har installeret JBuilder? Hvem har programmeret derhjemme? Mål med lektion 2 Fortrolighed med løkker Programmere lidt selv I gang med for projektet
19 Resumé Betinget udførelse if (betingelse) kommando; betingelse opfyldt? ja kommando nej eksempler: if (alder >= 18) System.out.println("Du er myndig"); if (alder == 18) System.out.println("Du er præcis atten"); if (alder!= 18) System.out.println("Du er ikke atten."); if else: if (betingelse) kommando1; else kommando2; betingelse opfyldt? nej ja kommando2 kommando1 eksempel, hvor vi også bruger en blok: if (alder >= 18) System.out.println("Du er myndig"); else System.out.println("Du er kun " + alder + " år."); System.out.println("Du er ikke myndig");
20 while løkken while (betingelse) kommando; betingelse opfyldt? ja kommando nej public class Syvtabel public static void main(string[] args) int n; n = 1; while (n <= 10) System.out.println(n+" : "+ 7*n); n = n + 1; for løkken for (initialisering; betingelse; opdatering) kommando; public class Syvtabel2 public static void main(string[] args) initialisering for (int n=1; n<=10; n=n+1) System.out.println(n+" : "+ 7*n); betingelse opfyldt? nej ja kommando opdatering
21 De simple typer Type Art Anta l bit Mulige værdier byte heltal til short heltal til int heltal til long heltal til float kommatal 32 ± E 45 til ± E+38 double kommatal 64 ± E 324 til ± E+308 Standard værdi char unicode 16 \u0000 til \uffff (0 til 65535) \u0000 boolean logisk 1 true og false false Konvertering automatisk hvor intervallet af de mulige værdier udvides eksplicit hvis intervallet af de mulige værdier indskrænkes int x; double y; x = 15; x = 15.1; x = 15.0; y = x; x = y; x = (int) y; // OK // Fejl // Fejl // OK implicit konvertering // Fejl // OK eksplicit konvertering
22 Model for udregninger, før kørsel int x; double y; x=3; y=2.9; x = (int) ( x + y + x / 4 ); Regnestykket deles op i delberegninger delresultat1 = x + y; delresultat2 = x / 4; delresultat3 = delresultat1 + delresultat2; delresultat4 = (int) delresultat3; x = delresultat4; Der sættes type på delresultaterne double delresultat1; int delresultat2; double delresultat3; int delresultat4; Typer på mellemresultater, værdier og variable ligger fast, når programmet er oversat Model for udregninger under kørsel Udregningerne foretages og gemmes undervejs i delresultater Delresultaterne smides væk
23 Hvordan bliver et program til? Et program til at tegne kurver Idé ******************** ******************* **************** ************* ********* ***** ** * *** ****** ********** ************** ***************** ******************* ******************* ****************** **************** ************ Konkret beskrivelse x sættes til intervalstart sålænge x < intervalslut beregn funktionens værdi for x skaler værdien til hvor mange * gennemløb så mange gange: udskriv * udskriv linieskift tæl x op Pseudokode Java program Program
24 For projekt Formål: At komme i gang med en programmeringsopgave Få noget øvelse Motivere til at programmere derhjemme Evt. idé til projekt På baggrund af erfaringer: Folk har ikke tid Folk kommer for sent i gang Folk mangler programmeringserfaring når de begynder projektet Oplæg til forprojekt: Du skal i løbet af de næste par øvelsesgange lave et program til at vise kurver og lave beregninger med Løsningerne skal præsenteres for en anden gruppe Som lektionerne skrider frem putter vi mere på opgaven Brug * til visning. Næste gang laver vi det grafisk Afleveres til lektion 6 Tag projektet med hver gang på diskette. Hvis du ikke har en diskette med i dag, så skriv programmet ud, og tast det ind igen derhjemme.
25 Opsamling Find en gruppe og evaluér sammen med. Præsentér jer for hinanden. Læs til og med til næste gang (også gerne resten) Tænk på nogle ideer til OOP projektet
26 Lektion 3 17:00 Praktisk 17:15 Et eksempel på et Kurveprogram 17:40 Kort om appletter 17:45 Pause 18:00 Objekter, klasser og Vector 18:45 Individuelle øvelser 20:15 Direkte hjem
27 En løsning på kurveprogrammet public class VisGraf public static void main(string[] args) double istart, islut; double skalering, forskydning; int antallinier; istart=0; islut=10; skalering=10; forskydning=10; antallinier=20; double trin; // hvor meget x skal tælles op med trin=(islut istart)/antallinier; int linienr; linienr=0; while (linienr < antallinier) double xværdi; double funktionsværdi; xværdi=linienr*trin + istart; funktionsværdi=math.cos(xværdi); int antalstjerner; antalstjerner=(int) (funktionsværdi*skalering +forskydning); int kolonnenr; kolonnenr=0; while (kolonnenr < antalstjerner) System.out.print("*"); kolonnenr=kolonnenr+1; System.out.println(); linienr=linienr+1;
28 Udvidelser: max på kurven udregnes kurven tegnes u udfyldt double max; max= ; int linienr; linienr=0; while (linienr < antallinier) double xværdi; double funktionsværdi; xværdi=linienr*trin; funktionsværdi=math.cos(xværdi); if (funktionsværdi>max) max=funktionsværdi; int antalstjerner; antalstjerner=(int) (funktionsværdi*skalering + forskydning); int kolonnenr; kolonnenr=0; while (kolonnenr < antalstjerner 1) System.out.print(" "); kolonnenr=kolonnenr+1; if (antalstjerner>0) System.out.print("*"); System.out.println(); linienr=linienr+1; System.out.println("max: "+max);
29 Resumé af objekter og klasser En klasse ligger som en del af programmet i en fil Findes inden programudførslen Et objekt eksisterer kun når programmet kører Når programudførslen kommer til et new En klasse er en beskrivelse af, hvordan de objekter der bliver skabt med denne klasse opfører sig. F.eks. er klassen Point en beskrivelse af hvordan objekter skabt med new Point er. En klasse svarer til en idé, en forklaring eller en definition af hvad noget er. Et objekt er så en konkret forekomst af det noget. Quiz: Punkter Hvad tror du en klasse er? Hvad tror du et objekt er? klassenavn: Point variabler: x y metoder: move(x,y) translate(x,y) Point() Point(x,y)
30 Løsning Klasse: "Et punkt er to heltal samlet i én komponent" Objekter: (1,0) (2,6) (13,2) (110,210)... For at oprette objekter i hukommelsenbruger man new : Point p; p = new Point(); p.x = 110; p.y = 210; p x 110 y 210 Der findes flere måder at oprette objekter på defineret ved deres konstruktører Point p2; p2 = new Point(3,0); Objekter har metoder der kan kaldes for at arbejde med dem p.move(2,3); p x 2 y 3
31 Klassen String public class Strengeleg public static void main(string[] args) String s; s = "Ude godt"; System.out.println("Strengen s indeholder: "+s); System.out.println("s er "+s.length()+" tegn lang"); System.out.println("s med store bogstaver: "+s.touppercase()); System.out.println("Tegn på plads nummer 2 er: "+s.charat(2)); System.out.println("Første g er på plads: "+s.indexof("g")); Strengen s indeholder: Ude godt s er 8 tegn lang s med store bogstaver: UDE GODT Tegn på plads nummer 2 er: e Første g er på plads nummer: 4 Streng objekterne ændrer sig aldrig, men gir nye strenge retur: s1 = "Ude godt, men hjemme bedst."; s2 = s1.touppercase(); s3 = s2.replace( E, X ); s4 = s3.substring(4, 20); men vi kan naturligvis godt ændre variablerne: s1 = s1.touppercase(); s1 refererer nu til "UDE GODT, MEN HJEMME BEDST."
32 Klassen Vector Når man har opretter et objekt af typen Vector, kan man bruge det som en variabel, der indeholder andre objekter. F.eks. kan man oprette et Vector objekt og lægge nogle objekter af type Point ind i det. Vector v = new Vector(); v.addelement(p1); v.addelement(p2); v.addelement(new Point(0,6));
33 Illustration af computerens hukommelse mens et program der bruger Vector og Point kører: Et objekt af typen Vector x 2 y 3 x 3 y 0 Tre objekter af typen Point x 0 y 6 Et andet Vector objekt x 0 y 9 x 3 y 0 x 4 y 7 x 1 y 1 Objekterne inde i et Vector objekt kaldes Vector objektets elementer.
34 Et Vector objekt indeholder nummererede variable, der refererer til elementerne. Point p; p = (Point) v.elementat(2); Det er nødvendigt at lave en typekonvertering af elementet, når det skal gemmes i en variabel. Med size() kan man se hvor mange elementer et Vector objekt indeholder. Det kan bruges til at gennemløbe elementerne i en vektor: for (int n=0; n<v.size(); n=n+1) Point p; p = (Point) v.elementat(n);...
35 Appletter Småprogrammer, der skal ligge i en hjemmeside. Ikke ligesom almindelige Java programmer: De har ingen main() Anden struktur: public class MinApplet extends Applet public void paint(graphics g) // g referer til et Graphics objekt man kan tegne med.... paint() udføres ikke kun når apletten starter, men hver gang appletten skal gentegnes (f.eks hvis vinduet har været skjult) I paint() kan man sende kommandoer til Graphics objektet: g.drawline(10,10,50,70); g.filloval(5,5,300,50); g.setcolor(color.green); g.drawstring("hej grafiske verden!",100,30);
36 Lektion 4 Praktisk Fra UML klassediagram til Java Pause Inspiration til for projektet Øvelser Praktisk Hvem har arbejdet med for projektet siden sidste gang? Hvem har fået lavet en grafisk kurvetegner applet? Spørgsmål til det læste
37 Fra UML klassediagram til Java public class Boks3 private double længde; private double bredde; private double højde; public Boks3() System.out.println("Standardboks oprettes"); sætmål(10, 10, 10); // En anden konstruktør der tager bredde, højde og længde public Boks3(double l, double b, double h) System.out.println("Boks oprettes med l="+l+" b="+b+" h="+h); sætmål(l,b,h); public void sætmål(double b, double h, double l) if (l<=0 b<=0 h<=0) Boks3 længde :double bredde :double højde :double +Boks3() +Boks3(l,b,h) +sætmål(l,b,h) +volumen() :double System.out.println("Ugyldige mål. Bruger standardmål."); længde = 10.0; bredde = 10.0; højde = 10.0; else længde = l; bredde = b; højde = h; public double volumen() return længde*bredde*højde;
38 Prøv at lave din egen klasse DoublePoint +x: double +y: double +translate(dx:double, dy:double) +distance(p: DoublePoint) : double DoublePoint er en klasse, der bruges fra main() public class DoublePoint public double x; public double y; public void translate(double dx, double dy)... public double distance(doublepoint p)... + bliver til public bliver til private Typer står efter i UML før i Java
39 Metodekroppen af translate() Hvad skal den gøre? Ændre koordinaterne for objektet selv? Lave nyt DoublePoint objekt? Tænk over hvordan den skal bruges DoublePoint p; P = new DoublePoint(2.5,3.4); p.translate(1.0,1.0); Metodekroppen af distance() Hvad skal den gøre? Ændre koordinaterne for objektet selv? Lave nyt DoublePoint objekt? Hvordan gives informationen tilbage til kalderen? Tænk over hvordan den skal bruges DoublePoint p1, p2; P1 = new DoublePoint(2.5,3.4); p2 = new DoublePoint(20,10); double afstand; afstand = p1.distance(p2); Man kan se udfra, hvordan den tænkes brugt, hvordan konstruktøren skal se ud
40 DoublePoints Konstruktører Skal sætte alle objektets variabler passende... public DoublePoint(double initx, double inity) x=initx; y=inity;... DoublePoints konstruktører skal naturligvis ligge i klassen DoublePoint Godt råd: kald IKKE paramteren i konstruktøren det samme som objektvariablen
41 Inspiration til for projekt: Polynomier F.eks f(x) = a*x*x + b*x + c AndengradsPolynomium + a: double + b: double + c: double + f(x:double) : double Eksempel på brug: Andengradspolynomium p; p = new Andengradspolynomium(1, 0.5,1); // 1*x*x 0.5*x+1 double y; y = p.f(3);
42 Næste trin Generelt polynomium: f.eks. f(x) = 8x x 2 + 3x Polynomieled: f.eks. " 10x 2 " Polynomieled: y = faktor*xpotens y = faktor*math.pow(x,potens); Polynomie består af en liste af Polynomieled
43 Klasser faktor: double potens: int PolynomieLed + f(x:double) : double Polynomium + alleled: Vector + f(x:double) : double Eksempel på brug: double y; PolynomieLed led; led = new PolynomieLed(2.0,2); y = led.f(3); Polynomium pol; pol = new Polynomium(); pol.alleled.addelement(led); led = new PolynomieLed(10.0,0); pol.alleled.addelement(led); y = pol.f(3); pol er nu polynomiet f(x) = 2x x 0 = 2x Husk at vektoren alleled i Polynomium skal oprettes med new Vector() i konstruktøren
44 Lektion 5 17:00 Praktisk 17:10 Opsamling: Egne klasser, objekter og relationer 17:45 Test dig selv af kapitel 3 og 4 18:00 Pause 18:10 Øvelser fra sidste gang 18:15 Projektet 18:25 Vi går til i øvelseslokalet 20:15 Slut på undervisning Praktisk Hvem har arbejdet med for projektet siden sidste gang? Hvem har lavet polynomiumsled? Hvem har styr på Vector? Spørgsmål
45 Egne klasser og objekter (fra bogen) public class BenytTerning public static void main(string args[]) Terning t; t = new Terning(); // opret terning Terning væ rdi :int +Terning() +kast() +tostring() :String // Slå nu med terningen indtil vi får en sekser boolean sekser = false; int antalkast = 0; while (sekser==false) t.kast(); antalkast = antalkast + 1; System.out.println("kast "+antalkast+": "+t.værdi); if (t.værdi == 6) sekser = true; System.out.println("Vi slog en 6 er efter " +antalkast+" slag."); kast 1: 4 kast 2: 2 kast 3: 6 Vi slog en 6 er efter 3 slag.
46 Klassen Terning (fra bogen) // En klasse der beskriver 6 sidede terninger public class Terning // den side der vender opad lige nu int værdi; // konstruktør public Terning() kast(); // kald kast() der sætter værdi til noget fornuftigt // metode til at kaste terningen public void kast() // find en tilfældig side double tilfældigttal = Math.random(); værdi = (int) (tilfældigttal * 6 + 1); // giver en beskrivelse af terningen som en streng public String tostring() String svar = ""+værdi; // værdi som streng, f.eks. "4" return svar;
47 Formen af klasser (fra bogen) // Klassenavn skal være i filen Klassenavn.java import klasser;... // f.eks. import java.util.*; public class Klassenavn // mellem og skal definitionen af klassen stå: // erklæring af variabler (og evt. samtidig initialisering) synlighed type navnpåobjektvariabel; public int n; private String s; private String s2 = "goddag"; // samtidig initialisering // erklæring af konstruktører, evt. med parametre synlighed Klassenavn(type1 parameter1, type2 parameter2,...) // kode der sætter objektvariablerne til startværdier... // eksempler på konstruktører: public Klassenavn() n = 5; s = "hej"; public Klassenavn(int nn, String ss) n = nn; s = ss; // erklæring af metoder, evt. med parametre synlighed returtype metodenavn(type1 param1, type1 param2,...)... // eksempel: public int metode1()... return 15; // noget af type int
48 Formen af en metode Metoder består af et hoved: public int metode1() og en krop: type1 lokalvariabel1; type2 lokalvariabel2;... // programkode her Metodehovedet Metodehovedet har formen: synlighed returtype metodenavn(type1 param1, type1 param2,...) Eksempler: double volumen() public void sætmål(double b, double h, double l) public void tilføj(terning t) public void kast() public int antalderviser(int værdi) public void præsentation() public Konto(Person ejer) public void overførsel(int kroner) public String tostring() Metodekroppen public int metode3()... return 42;
49 Relationer mellem egne klasser Et objekt kan have andre objekter i sig (en har relation) Raflebaeger +terninger: Vector +Raflebaeger(antalTerni :int) +tilføj( :Terning) +ryst() +sum() :int +antalderviser(væ rdi :int) :int +tostring() :String * Terning (variabler og metoder ikke vist) public class ToSeksere public static void main(string[] args) Raflebaeger bæger; boolean toseksere; int antalforsøg; bæger = new Raflebaeger(3); // opret et bæger med 3 terninger toseksere=false; antalforsøg = 0; while (toseksere==false) bæger.ryst(); // kast alle terningerne System.out.print("Bæger: " + bæger + " sum: " + bæger.sum()); System.out.println(" Antal 6 ere: "+bæger.antalderviser(6) + " antal 5 ere: "+bæger.antalderviser(5)); if (bæger.antalderviser(6) == 2) toseksere = true; antalforsøg++; System.out.println("Du fik to seksere efter " + antalforsøg+" forsøg."); Bæger: [4, 4, 4] sum: 12 Antal 6 ere: 0 antal 5 ere: 0 Bæger: [5, 5, 6] sum: 16 Antal 6 ere: 1 antal 5 ere: 2 Bæger: [6, 4, 1] sum: 11 Antal 6 ere: 1 antal 5 ere: 0 Bæger: [6, 6, 4] sum: 16 Antal 6 ere: 2 antal 5 ere: 0 Du fik to seksere efter 4 forsøg.
50 import java.util.*; public class Raflebaeger public Vector terninger; // Rafleb. har en vektor af terninger public Raflebaeger(int antalterninger) terninger = new Vector(); for (int i=0;i<antalterninger;i++) Terning t = new Terning(); tilføj(t); public void tilføj(terning t) // Læg en terning i bægeret terninger.addelement(t); public void ryst() // Kast alle terningerne for (int i=0;i<terninger.size();i++) Terning t = (Terning) terninger.elementat(i); t.kast(); public int sum() // Summen af alle terningers værdier int resultat = 0; for (int i=0;i<terninger.size();i++) Terning t = (Terning) terninger.elementat(i); resultat = resultat + t.værdi; return resultat; public int antalderviser(int værdi) // Antal med denne værdi int resultat = 0; for (int i=0;i<terninger.size();i++) Terning t = (Terning) terninger.elementat(i); if (t.værdi==værdi) resultat = resultat + 1; return resultat; Variablen terninger refeterer til nogle Terning objekter Derfor relationen: Raflebaeger har en Terning
51 Nøgleordet this this refererer til det objekt man er i public class Boks2medThis private double længde; private double bredde; private double højde; // næsten som om der her stod // private Boks2medThis this; public void sætmål(double længde, double bredde, double højde) this.længde = længde; this.bredde = bredde; this.højde = højde; public void tilføjtilvektor(vector v) v.addelement(this);... b this længde 10 bredde 10 højde 10 this virker som en variabel der refererer til objektet selv. Vector v = new Vector() Boks2medThis b = new Boks2medThis();... Normalt ville vi tilføje en boks til en vektor med: v.addelement(b); Med metoden tilføjtilvektor() kan vi i stedet for bede b om at tilføje sig selv til en vektor: b.tilføjtilvektor(v);
52 Test dig selv kapitel 3 og 4 For projektet I opgaven skal I lave objekter der har relationer til hinanden. For eksempel et polynomium objekt der har nogle led objekter: Polynomium er f.eks. f(x) = 8x x 2 + 3x Polynomieled er f.eks. 10x 2 (men senere mere generelle funktioner!) Husk når I laver jeres program: Programmets kildetekst skal være let at forstå (for en anden person på kurset) Du skal definere tre klasser Rapporten kan være et diagram over klasserne og en kort forklaring.
53 Hvem skal tegne polynomiet? For at kunne tegne et polynomie kræves ikke kun polynomiet selv, men også intervalstart, slut o. a. Overføre Graphics objektet fra applettens paint() til PolynomiumsTegner objektets tegn() : public void paint(graphics g)... PolynomiumsTegner tegner = new PolynomiumsTegner();... tegner.tegn(g,pol); Polynomiumstegner + xskalering: double + yskalering: double + xforskydning: double + yforskydning: double + istart: double + islut: double + tegn(graphics g, Polynomum p) Nu er tegningen af grafen uddelegeret til et andet objekt Polynomier skal ikke kun kunne tegnes i appletter, men også i andre grafiske programmer. De kan alle bruge PolynomiumsTegner. Tænk også over: Skal programmet kunne tegne flere funktioner samtidig? skrive funktionsudtrykke(ne)? tegne akserne, måske med et akse objekt? finde max og min? integrere? andet?
54 Lektion 6 Praktisk Øvelser fra sidste gang Opsamling: Egne klasser, objekter og relationer Pause Nedarving Vi går til i øvelseslokalet
55 Introduktion til nedarvning Situation: Man har en eksisterende klasse som virker, men man vil gerne tilføje ekstra funktionalitet, uden at ændre den oprindelige klasse. To løsninger: 1)Man kan kopiere klassen, give den et nyt navn og tilføje den ønskede funktionalitet. Men hvad hvis det er en klasse man ikke har kildekoden til? Senere fejlrettelser i den oprindelige klasse skal laves flere steder. 2)Man kan lave en ny klasse og arve fra den oprindelige klasse. Eksempel på nedarvning: FalskTerning Terning // En Terning klasse for falske terninger. public class FalskTerning1 extends Terning // tilsidesæt kast med en "bedre" udgave FalskTerning1 + kast() public void kast() // udskriv så vi kan se at metoden bliver kaldt System.out.print("[kast() på FalskTerning1] "); værdi = (int) (6*Math.random() + 1); // er det 1 eller 2? Så lav det om til 6! if ( værdi <= 2 ) værdi = 6; FalskTerning1 arver variabler og metoder fra Terning, men metoden kast() er anderledes. Er en relation: FalskTerning1 er en Terning.
56 public class Snydespil1 public static void main(string[] args) Terning t1 = new Terning(); FalskTerning1 t2 = new FalskTerning1(); System.out.println("t1: "+t1); // ku også kalde t1.tostring() System.out.println("t2: "+t2); for (int i=0; i<5; i++) t1.kast(); t2.kast(); System.out.println("t1=" + t1 + " t2=" + t2); if (t1.værdi == t2.værdi) System.out.println("To ens!"); [kast() på FalskTerning1] t1: 1 t2: 3 [kast() på FalskTerning1] t1=1 t2=5 [kast() på FalskTerning1] t1=1 t2=3 [kast() på FalskTerning1] t1=4 t2=3 [kast() på FalskTerning1] t1=6 t2=6 To ens! [kast() på FalskTerning1] t1=2 t2=6 En klasse kan arve variabler og metoder fra en anden Klassen der nedarves fra kaldes superklassen Den nye klasse (der arver fra superklassen) kaldes underklassen Underklassen kan tilsidesætte (omdefinere) metoder arvet fra superklassen ved at definere dem igen Det tegnes således: Superklasse Underklasse
57 At udbygge med flere metoder og variabler Terning public class FalskTerning2 extends Terning public int snydeværdi; public void sætsnydeværdi(int nysnydeværdi) snydeværdi = nysnydeværdi; FalskTerning2 + snydevæ rdi :int + sæ tsnydevæ rdi(v :int) + kast() public void kast() System.out.print("[kast() på FalskTerning2] "); værdi = (int) (6*Math.random() + 1); // 1 eller 2? Så lav det om til snydeværdi! if ( værdi <= 2 ) værdi = snydeværdi; public class Snydespil2 public static void main(string[] args) FalskTerning2 t1 = new FalskTerning2(); t1.sætsnydeværdi(4); for (int i=0; i<5; i++) t1.kast(); System.out.println("t1=" + t1); [kast() på FalskTerning2] [kast() på FalskTerning2] t1=4 [kast() på FalskTerning2] t1=4 [kast() på FalskTerning2] t1=6 [kast() på FalskTerning2] t1=6 [kast() på FalskTerning2] t1=4
58 Introduktion til polymorfi public class Snydespil2polymorfi public void main(string[] args) FalskTerning2 falsktern = new FalskTerning2(); falsktern.sætsnydeværdi(4); Terning tern = falsktern; // tilladt for (int i=0; i<5; i++) tern.kast(); System.out.println("t1=" + t1); // ikke tilladt: falsktern.sætsnydeværdi(4); [kast() på FalskTerning2] [kast() på FalskTerning2] t1=øjne:4 [kast() på FalskTerning2] t1=øjne:6 [kast() på FalskTerning2] t1=øjne:3 [kast() på FalskTerning2] t1=øjne:6 [kast() på FalskTerning2] t1=øjne:4 Tildele en variabel af superklassen et objekt af underklassen. FalskTerning er en Terning, og det er tilladt at behandle FalskTerning-objektet "som om" det er et Terning objekt. Men det er stadig FalskTernings kast() metode der kaldes. Generelt: De metoder der kan kaldes er dem fra variabeltypen (Terning). De metoder der bliver kaldt er dem fra objektet (FalskTerning). Polymorfi betyder "mange former". En Terning variabel kan referere til mange slags objekter: Et Terning objekt, et FalskTerning objekt eller et andet objekt, hvis klasse arver fra Terning.
59 Nedarvnings hierakier Med arv kan man skabe et hierarki af klasser der ligner hinanden og samtidig kan opføre sig forskelligt. Her er vist en skitse til klassediagrammet fra et matadorspil. Felt navn :String + passeret(sp :Spiller) + landet(sp :Spiller) Helle gevinst :double +landet(sp:spiller) Start gevinst :double + passeret(sp:spiller) + landet(sp :Spiller) Spiller navn :String konto :double feltnr :int + transaktion(kr :double) + betal(modt :Spiller, kr :double) + tur(felter :Vector) Rederi ejer :Spiller pris :double grundleje :double +landet(sp:spiller) Gade ejer :Spiller pris :double grundleje :double antalhuse :int huspris :double +landet(sp:spiller) Ide til forprojekt: Lav klassen Funktion med en metode til at beregne en funktionsværdi. Lav nedarvinger Sinus, Kvadratrod, Polynomium,... Eet sted i programmet oprettes et funktions objekt: Funktion f = new Kvadratrod(); Resten af programmet bruger objektet som om det var en Funktion.
60 Trinvis gennemgang med JBuilder Klik ude i venstre margen (den grå kant) på en af de første linier i dit program, der vil nu komme en rød prik. Dette markerer et stoppunkt (eng: breakpoint). Når du trykker skift F9, udfører JBuilder dit program, men i "debug" mode. Dvs. den stopper ved dit stoppunkt. Den grønne pil viser, hvor langt den er kommet. Du kan nu bruge F8 til at hoppe til næste linie. Mulighederne findes i "run" menuen: step over (F8): hopper til næste linie. step into (F7): Hvis du står ved et metodekald hopper du ind og kan se metoden blive udført (gør det kun ved de metoder du selv har defineret). step out: Hvis du er inde i et metodekald udføres programmet indtil det vender tilbage til kalderen. resume program (F9): fortsætter programudførslen og stopper ved næste stoppunkt den kommer til. reset program: stopper den trinvise gennemgang.
61 Det kan være lidt svært at få det til at virke. Læg mærke til at man kan komme til at køre sit program flere gange på samme tid. Der vises nederst flere faneblade med samme programnavn (session på figuren). Bemærk iøvrigt at i denne version af JBuilder (den gratis version) viser den også system klassernes udførsel. Det er du næppe interesseret i. Kommer du således ind i noget kode, som du ikke selv har skrevet, så brug "step out" for at komme tilbage til dine egne klasser. Det er derfor det er smart at sætte et stoppunkt ved første linie i programmet. Hvis man bruger F8 først, så hopper JBuilder ind i nogle skumle system klasser. Du skal også være opmærksom på at det ikke er alle steder i programmet, hvor man kan sætte stoppunkter: Hvis den røde prik får et kryds henover ( ), så betyder det at stoppunktet ikke virker. En tommelfingerregel er at man skal sætte stoppunkter på de linier, der "gør" noget. dvs. tildelinger og metodekald. Stoppunkter på erklæringer, blok paranteser og metodehoveder virker ikke. Du kan også undersøge variables værdi under programudførslen. I dialogen "run/add watch" kan du skrive navnet på en variabel. I nederste del af JBuilder (der hvor uddata for programmet normalt vises) er der en række faneblade. I fanebladet med et par briller ( ) vises de variable du har tilføjet med "add watch". Du kan også bruge fanebladet med en lille rulle tråd som ikon ( ), men det er lidt sværere at overskue.
62 Lektion 7 Resume: arv, super Alting arver fra Object Forprojekterne Resume: polymorfi Konstruktører og arv Nedarvning i graf tegningsprogrammet Øvelser / vejledning i obligatorisk opgave Praktisk Afkrydsning Midtvejsevaluering Hvem har lavet et forprojekt og har en udskrift med? Fordel for alle, hvis de der kender stoffet hjælper dem, der har svært ved det Avanceret afsnit Spørgsmål til det læste
63 I dag: Udveksling af forprojekterne Dan grupper på to eller tre. Du skal mindst se ét program med Polynomium og Polynomieled Sæt dig sammen med en du ikke før har været sammen med Læreren og hver gruppemedlem får en kopi af hver rapport. Den læses til næste gang. Forklar kort hvordan jeres programmer virker: hvad hedder klasserne hvilke metoder og variable har de hvor mange objekter oprettes der hvad kalder hvad Næste gang: Gennemsyn af forprojekter Læs rapporterne og forstå hvordan programmet virker Foreslå forbedringer af de andres programmer på en positiv facon. Prøv at se om du kan finde logiske fejl Tag pænt imod forslag og kritik
64 Resume arv En klasse kan arve variabler og metoder fra en anden klasse (med "extends") Klassen der nedarves fra kaldes superklassen Superklasse Underklasse Klassen der arver fra superklassen kaldes underklassen Underklassen kan tilsidesætte (omdefinere) metoder arvet fra superklassen ved at definere dem igen For at tilsidesætte en metode, skal man i underklassen lave en eksakt kopi af metode hovedet fra superklassen super Med super får man adgang til metoder som de er kendt i superklassen. Terning FalskTerning3 +kast() Det kan være nyttigt til at genbruge programkode public class FalskTerning3 extends Terning public void kast() super.kast(); // kald den oprindelige kast() metode // blev det 1 eller 2? Så lav det om til 6! if ( værdi <= 2 ) værdi = 6;
65 Polymorfi f.eks: En variabel kan godt referere til objekter af en underklasse af variablens type Terning t; t = new FalskTerning3(); Variablens type bestemmer, hvilke metoder man kan kalde på objektet, og hvilke objektvariable man kan læse og ændre (f.eks er t af type Terning, ligemeget hvad den refererer til) f.eks: Objektets type bestemmer hvilken metode definition (krop) der bliver udført t.kast(); // her bliver FalskTerning3 s kast() kaldt dette kan bruges til at skabe hierakier af objekter der ligner hinanden, men opfører sig forskelligt
66 Alting arver fra Object Object tostring(): String equals(o: Object): boolean Vector addelement(o :Object) size() :int elementat(indeks:int):object tostring() :String Point x :int y :int Point() Point(x:int,y:int) move(x:int,y:int) tostring() :String Terning væ rdi: int kast() tostring(): String FalskTerning1 kast() Boks læ ngde :double bredde :double højde :double volumen() :double derfor kendes bl.a. tostring() metoden af alle objekter
67 Konstruktører skal defineres på ny i en nedarving public class Boks3medDensitet extends Boks3 private double densitet; public Boks3medDensitet() // overflødig, den kaldes implicit: // super(); massefylde = 10.0; Boks3 Boks3medDensitet + Boks3medDensitet () + Boks3medDensitet(l,b,h,d) + vægt() : double Boks3medDensitet tillader oprettelse på to måder public Boks3medDensitet(double l, double b, double h, double densitet) // kald superklassens konstruktør med parametre super(l,b,h); this.densitet = densitet; public double vægt() // superklassen udregner volumen for os return volumen() * densitet; Konstruktører skal defineres på ny i en underklasse En konstruktør i en underklasse kalder først en af superklassens konstruktører Superklassens konstruktør kan kaldes med: super(parametre) Hvis programmøren ikke kalder en af superklassens konstruktører, indsætter Java automatisk et kald af superklassens konstruktør uden parametre
68 Nedarvning i graf tegningsprogrammet Funktion + f(x:double) : double Sum alleled : Vector + Sum() + tilføj(fx:funktion) + f(x:double) : double + tostring() :String PolynomieLed faktor : double potens : int + PolynomieLed(f,p) + f(x:double) : double + tostring() :String Sinus + f(x:double) : double + tostring() :String GrafTegner + istart : double + islut : double + trin : double + skalering : double... + tegn(g:graphics, f:funktion) public class GrafTegner... void tegn(graphics g, Funktion f) double gx=istart; // gammel x værdi for (double x=istart+trin;x<islut;x=x+trin) //uden skalering: g.drawline( gx=x; (int)gx,(int)f.f(gx), (int)x, (int)f.f(x));
69 Lektion 8 Test dig selv Gå igennem afsnit 5.7 to og to og tjek at I kan svare på spørgsmålene
70 Appletter HTML dokumentet <HTML> <HEAD> </HEAD> <BODY> </BODY> </HTML> <TITLE>Min applet</title> Velkommen til min første applet!<br> <APPLET CODEBASE = "." CODE = "MinApplet.class" WIDTH = 400 HEIGHT = 300> </APPLET> Slut herfra! Java koden import java.awt.*; import java.applet.*; public class MinApplet extends Applet public void paint(graphics g) // Herunder referer g til et Graphics objekt man kan tegne med. g.drawline(10,10,50,70); g.filloval(5,5,300,50); g.setcolor(color.green); g.drawstring("hej grafiske verden!",100,30);
71 Metoder som du kan kalde Nogle af Applet klassens metoder repaint(int millisekunder) int getwidth() (fra JDK 1.2) int getheight() (fra JDK 1.2) Dimension getsize() AudioClip getaudioclip(url url, String filnavn) returnerer et lydklip objekt, typisk fra en.wav fil. Image getimage(url url, String filnavn) returnerer et billede objekt, typisk fra en.jpg eller.gif fil. Metoder som fremviseren kalder public class Fremvisertest extends Applet public Fremvisertest() System.out.println("Konstruktøren blev kaldt"); public void init() System.out.println("Appletten er initaliseret"); public void start() System.out.println("Appletten er synlig"); public void paint(graphics g) System.out.println("Appletten bliver tegnet på skærmen"); public void stop() System.out.println("Appletten er ikke mere synlig"); public void destroy() System.out.println("Appletten smides væk");
72 Generering af grafiske brugergrænseflader
73
74
75 import java.applet.*; import java.awt.*; public class MinApplet extends Applet TextField textfieldnavn = new TextField(); public void paint(graphics g)... public MinApplet() textfieldnavn.settext("jacob"); textfieldnavn.setbounds(new Rectangle(141, 61, 112, 29)); this.setlayout(null); this.add(textfieldnavn, null); Udviklingsværktøjer Bemærk at værktøjer som JBuilder vil lægge initialiseringen i en separat metode, f.eks. private void jbinit() throws Exception textfieldnavn.settext("jacob"); textfieldnavn.setbounds(new Rectangle(141, 61, 112, 29)); this.setlayout(null); this.add(textfieldnavn, null); som så kaldes fra konstruktøren: public MinApplet() try jbinit(); catch(exception e) e.printstacktrace();
76 Applikationer Programkoden i det grafiske vindue minder meget om koden i en applet, blot skal der arves fra Frame i stedet for Applet: import java.awt.*; public class GrafiskVindue extends Frame // paint() metode og intialisering af grafiske komponenter: TextField textfieldnavn = new TextField(); public void paint(graphics g)... public GrafiskVindue() textfieldnavn.settext("jacob"); textfieldnavn.setbounds(new Rectangle(141, 61, 112, 29)); this.setlayout(null); this.add(textfieldnavn, null); Beder man JBuilder oprette en ny applikation vil den generere to filer: Frame1.java (der repræsenterer det grafiske vindue). Application1.java (den der indeholder main() metoden) og public class GrafiskProgram public static void main(string args[]) GrafiskVindue gv = new GrafiskVindue(); gv.pack(); gv.show();
77 Grafiske komponenter Komponenter: Label, TextField, Button,... Containere: Frame, Dialog (e.v.t. modal), Menubar, Menu, Toolbar FlowLayout BorderLayout GridBagLayout
78
79 Java Examples in a Nutshell, kapitel 10 GUI = Graphical User Interface = Grafisk brugergrænseflade Hændelsesbaseret programmering AWT de gamle klasser ( i pakken java.awt ) Swing de nye klasser ( i pakken javax.swing ) Interface: Tænk på det som "klasse" Alle et interface s metoder skal tilsidesættes Det hedder "implements" i stedet for "extends" Hændelser Forskellige typer: ActionEvent, ItemEvent, KeyEvent, MouseEvent, MouseMotionEvent Listener hændelseslytter ActionListener, ItemListener, KeyListener, MouseListener, MouseMotionListener Adapter Klasse ligesom den tilsvarende hændelseslytter KeyAdapter, MouseMotionAdapter, MouseAdapter Brug en adapter, istedet for en listener, hvis I kan
80 Lektion 9 Praktisk Gennemgang af Matador? Undtagelser og stakspor JDBC databaseadgang Vejledning i obligatorisk opgave Praktisk Spørgsmål til det læste Hvor mange har læst i bogen? Hvor mange har læst i Java Examples? Obligatorisk opgave: Er der nogen der ikke er i en gruppe? Er der nogen der ikke ved hvad de vil lave? Næste gang: Obligatorisk opgave Skitsér de skærmbilleder der endnu mangler Find relevante navneord, udsagnsord og tillægsord for programmet
81 Løsning til Matador opgave Felt.java public class Felt... Point pos = new Point(); public void tegn(graphics g) g.setcolor(color.black); g.drawstring(navn,pos.x,pos.y); public void tegnbil(graphics g, Spiller s) g.setcolor(s.farve); g.drawstring(s.navn,pos.x,pos.y 10); g.drawroundrect(pos.x,pos.y 11,40,12,5,5); Grund2.java public class Grund2 extends Felt... public void tegn(graphics g) super.tegn(g); if (ejer!= null) g.setcolor(color.blue); g.drawstring(ejer.navn,pos.x,pos.y+10); Gade2.java public class Gade2 extends Grund2... public void tegn(graphics g) super.tegn(g); if (antalhuse > 0) g.drawstring(antalhuse + " huse",pos.x,pos.y+20);
82 MatadorApplet.java import java.awt.*; import java.util.*; import java.awt.event.*; import java.applet.*; import javax.swing.*; public class MatadorApplet extends Applet Spiller sp1=new Spiller("Søren",50000,Color.green); Spiller sp2=new Spiller("Gitte",50000,Color.yellow); int tur = 0; Vector felter=new Vector(); JButton jbuttonspilentur = new JButton(); public MatadorApplet() felter.addelement(new Start(5000)); felter.addelement(new Gade2("Gade 1",10000, 400,1000)); felter.addelement(new Gade2("Gade 2",10000, 400,1000)); felter.addelement(new Gade2("Gade 3",12000, 500,1200)); felter.addelement(new Chancen(10000)); felter.addelement(new Gade2("Gade 5",15000, 700,1500)); felter.addelement(new Rederi2("Maersk",17000,4200)); felter.addelement(new Helle(15000)); felter.addelement(new Gade2("Gade 7",20000,1100,2000)); felter.addelement(new Gade2("Gade 8",20000,1100,2000)); felter.addelement(new Gade2("Gade 9",30000,1500,2200)); for (int i=0; i<felter.size(); i++) Felt f = (Felt) felter.elementat(i); double v = Math.PI*2*i/felter.size(); f.pos.move(100 + (int) (100*Math.cos(v)), (int) (100*Math.sin(v))); try jbinit(); catch(exception e) e.printstacktrace(); private void jbinit() throws Exception jbuttonspilentur.settext("spil en tur"); jbuttonspilentur.setbounds(new Rectangle(280, 272, 117, 25)); jbuttonspilentur.addactionlistener( new java.awt.event.actionlistener() public void actionperformed(actionevent e) jbuttonspilentur_actionperformed(e); ); this.setlayout(null); this.add(jbuttonspilentur, null);
83 public void paint(graphics g) for (int i=0; i<felter.size(); i++) Felt f = (Felt) felter.elementat(i); f.tegn(g); Felt f = (Felt) felter.elementat(sp1.feltnr); f.tegnbil(g,sp1); g.drawstring(sp1.navn,300,10); g.drawstring(sp1.konto+" kr",300,20); f = (Felt) felter.elementat(sp2.feltnr); f.tegnbil(g,sp2); g.drawstring(sp2.navn,300,110); g.drawstring(sp2.konto+" kr",300,120); spilentur(); void spilentur() tur = tur + 1; if (tur % 2 == 0) sp1.tur(felter); else sp2.tur(felter); repaint(500); void jbuttonspilentur_actionperformed(actionevent e) spilentur();
84 Undtagelser og stakspor import java.util.*; public class SimpelUndtagelse public static void main(string[] args) System.out.println("Punkt A"); // punkt A Vector v = new Vector(); System.out.println("Punkt B"); // punkt B v.elementat(5); System.out.println("Punkt C"); // punkt C Punkt A Punkt B java.lang.arrayindexoutofboundsexception: 5 >= 0 at java.util.vector.elementat(vector.java:417) at SimpelUndtagelse.main(SimpelUndtagelse.java:10) Exception in thread "main" En metode kan "protestere" med en undtagelse, hvis det er uforsvarligt at fortsætte. Der findes forskellige typer undtagelser ArrayIndexOutOfBoundsException NumberFormatException NullPointerException FileNotFoundException * IOException * * = tvungen håndtering De er allesammen klasser, og de arver fra klassen Exception Stak sporet viser hvor fejlen opstod
85 Undtagelser kan fanges og behandles import java.io.*; public class Tastatur1 BufferedReader ind; public Tastatur1() ind = new BufferedReader( new InputStreamReader(System.in)); Tastatur ind: BufferedReader +læslinie() :String +læstal() :double public String læslinie() try String linie = ind.readline(); return linie; catch (IOException u) u.printstacktrace(); return null; public double læstal() String linie = læslinie(); return Double.parseDouble(linie); Syntaks: try... // programkode hvor der er en risiko... // for at en undtagelse opstår catch (Undtagelsestype u)// Undtagelsestype er f.eks. Exception... // kode som håndterer fejl af... // typen Undtagelsestype... // dette udføres både hvis ingen undtagelse opstod... // og hvis der opstod fejl af typen Undtagelsestype
86 public class SumMedTastatur public static void main(string arg[]) Tastatur1 t = new Tastatur1(); boolean stop = false; try while (!stop) System.out.print("Hvormange tal lægge sammen? "); double antaltal = t.læstal(); double sum = 0; for (int i=0; i<antaltal; i=i+1) System.out.print("Indtast tal: "); sum = sum + t.læstal(); System.out.println("Summen er: "+sum); System.out.print("Vil du prøve igen? (j/n)"); if ("n".equals(t.læslinie()) stop = true; catch (Exception u) System.out.println("Der opstod en undtagelse!"); u.printstacktrace(); Hvor mange tal vil du lægge sammen? 2 Indtast tal: 1 Indtast tal: 2 Summen er: 3.0 Vil du prøve igen? j Hvor mange... Brugeren taster og taster... men hvad sker der hvis han taster forkert? Hvor mange tal vil du lægge sammen? 3 Indtast tal: 1 Indtast tal: 17xxøføf Der opstod en undtagelse! java.lang.numberformatexception: 17xxøføf at..readjavaformatstring(floatingdecimal.java:1182) at java.lang.double.parsedouble(double.java:190) at Tastatur1.læsTal(Tastatur1.java:27) at SumMedTastatur.main(SumMedTastatur.java:18).. og programmet stopper.
87 Præcis håndtering af undtagelser med try catch inde i while løkken: public class SumMedTastatur2 public static void main(string arg[]) Tastatur1 t = new Tastatur1(); boolean stop = false; while (!stop) System.out.print("Hvor mange tal lægge sammen? "); try double antaltal = t.læstal(); double sum = 0; for (int i=0; i<antaltal; i=i+1) System.out.print("Indtast tal: "); sum = sum + t.læstal(); System.out.println("Summen er: "+sum); catch (Exception u) System.out.println("Indtastningsfejl " + u); System.out.print("Vil du prøve igen? (j/n)"); if ("n".equals(t.læslinie()) stop = true; Hvor mange tal vil du lægge sammen? 5 Indtast tal: 1 Indtast tal: x2z Indtastningsfejl java.lang.numberformatexception: x2z Vil du prøve igen? j Hvor mange tal vil du lægge sammen? 3 Indtast tal: 1200 Indtast tal: 1 Indtast tal: 1.9 Summen er: Vil du prøve igen? n
88 JDBC databaseadgang Indlæse driver Oracle database: Class.forName("oracle.jdbc.driver.OracleDriver"); Oprette forbindelse Oracle database: Connection forb = DriverManager.getConnection( "jdbc:oracle:thin:@oracle.cv.ihk.dk:1521:student", "stuk1001", "stuk1001"); Med Java under Windows følger en standard JDBC ODBC bro: Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); Connection forb = DriverManager.getConnection ( "jdbc:odbc:datakilde1","",""); Derefter oprettes en prompt Statement stmt = forb.createstatement();... og man er klar til at sende SQL til databasen Kommandoer stmt.executeupdate( "create table KUNDER (NAVN varchar(32), KREDIT float)" ); stmt.executeupdate("insert into KUNDER values( Jacob, 1799)"); stmt.executeupdate("insert into KUNDER values( Brian, 0)"); Forespørgsler ResultSet rs = stmt.executequery( "select NAVN, KREDIT from KUNDER"); ResultSet objektet repræsenterer svaret på forespørglsen: while (rs.next()) String navn = rs.getstring("navn"); float kredit = rs.getfloat("kredit"); System.out.println(navn+" "+kredit);
89 Indkapsling og abstaktion pak det ind i en klasse for sig Definér Databaseforbindelse objekt og pak data ind i en specialiceret klasse, f.eks: public class Kunde String navn; double kredit; public Kunde(String n, double k) navn = n; kredit = k; public String tostring() return navn+": "+kredit+" kr."; Så kan programmet abstrahere fra hvordan data er lagret import java.util.*; public class BenytDatabaseforbindelse public static void main(string arg[]) try Databaseforbindelse dbf = new Databaseforbindelse(); // dbf.oprettestdata(); // sæt ind hvis tabellen ikke findes Vector v = dbf.hentalle(); System.out.println("Alle data: "+v); dbf.sletalledata(); dbf.indsæt( new Kunde("Kurt",1000) ); catch(exception e) System.out.println("Problem med database: "+e); e.printstacktrace(); Alle data: [Kurt: kr.]
90 import java.sql.*; import java.util.*; public class Databaseforbindelse private Connection forb; private Statement stmt; public Databaseforbindelse() throws Exception Class.forName("oracle.jdbc.driver.OracleDriver"); Connection forb = DriverManager.getConnection( "jdbc:oracle:thin:@oracle.cv.ihk.dk:1521:student", "stuk1001","hemli "); stmt = forb.createstatement(); public void sletalledata() throws SQLException stmt.execute("truncate table KUNDER"); public void oprettestdata() throws SQLException try // hvis tabellen allerede eksisterer opstår der en // SQL udtagelse stmt.executeupdate( "create table KUNDER (NAVN varchar(32), KREDIT float)" ); catch (SQLException e) System.out.println("Kunne ikke oprette tabel: "+e); stmt.executeupdate( "insert into KUNDER values( Jacob, 1799)"); stmt.executeupdate("insert into KUNDER values( Brian, 0)"); public void indsæt(kunde k) throws SQLException stmt.executeupdate( "insert into KUNDER values( " + k.navn + ", " + k.kredit + ")");
91 public Vector hentalle() throws SQLException Vector alle = new Vector(); ResultSet rs = stmt.executequery( "select NAVN, KREDIT from KUNDER"); while (rs.next()) Kunde k = new Kunde( rs.getstring("navn"), rs.getdouble("kredit")); alle.addelement(k); return alle;
92 Lektion 10 Virkefelt Intro til objektorienteret analyse og design (OOAD) Demonstration: Grafiske programmer med JBuilder Vejledning i obligatorisk opgave
93 Objektorienteret analyse Analysens formål er at afspejle virkeligheden mest muligt. Skrive vigtige ord op Yatzyspil Terning værdi, kaste, holde Raflebæger kombination, ryste, holde Blok skrive spillernavn på, skrive point på Spiller navn Computerspiller Strategi Menneske Regel (kunne også kaldes en mulighed eller et kriterium) opfyldt, pointgivning Lager Brugsmønstre spiller yatzy kaster terninger udvæ lger terninger Spiller spiller yatzy Aktiv spiller væ lger regel tjekker regel Spiller husker resultat Lager opdaterer blok Kon trollant
94 Aktivitetsdiagrammer Aktivitetsdiagrammer beskriver den rækkefølge, som adfærdsmønstre og aktiviteter foregår i. Eksempel: Aktiviteten "definere deltagere i spillet": væ lg spillertype (computer/menneske) væ lg spillernavn flere spillere føj til blok Herunder ses et diagram for spillets gang, "en tur": kast terninger flere kast og mulighed for bedre resultat Aktiv spiller væ lg terninger udregn point opdatér blok regel opfyldt regel ikke opfyldt konsultér regler væ lg regel bedste resultat eller ikke flere kast
95 Skærmbilleder Navn: Søren Computer Menneske Tilføj Fæ rdig TilfoejSpillervindue Søren Hold Kast! Fæ rdig Turvindue Ettere Toere Treere etc... Jacob 4 Søren 9 Sum Bonus Et par etc... Sum Blokvindue
96 Objektorienteret design Designets formål er at beskrive, hvordan programmet skal implementeres. Kollaborationsdiagrammer Regel har Blok opdaterer fremviser Blokvindue Raflebaeger tjekker bruger har har Spiller har Terning Spiller Computerspiller er en er en DumComputerspiller GraadigComputerspiller er en Menneske opdaterer fremviser Turvindue
97 Klassediagrammer kan tegnes med et UML værktøj
98
99 Virkefelt En variabels virkefelt er de steder i programmet man kan "se" variabel navnet. main(...) int i;... if (i>0) int res=i; else int res= i; System.out.println("Den absolutte værdi af "+ i+" er :"); System.out.println(res); En lokal variabels virkefelt er fra dens erklæring ned til afslutningen af den blok, den blev erklæret i. En objekt variabels virkefelt er hele klassen.
100 Demo:Grafiske programmer med JBuilder åbn JBuilder File/new project File/new.../Applet: extends java.lang.applet. Kald apletten StregApplet. Med standalone. indsæt objektvariabel: Vector punkter = new Vector();... og importer java.util.* Design: layout: BorderLayout Swing Containers/JPanel placeres i bunden. Bemærk constraints=south. name ændres til knappanel Swing Containers/JPanel placeres i centrum. Bemærk constraints=center. (den hedder nu JPanel2) Klik på knappanel. I midten er der en sort firkant. Swing/JButton placeres på denne firkant. Swing/JToggleButton placeres på denne firkant. Ændr text i JButton1 til "slet punkt" og JToggleButton1 til "flyt punkter" Klik på JPanel2. klik på Events. klik til højre for MouseClicked, og tryk enter. Den hopper nu over i en metode, der hedder jpanel2_mouseclicked(). udfyld den med: if (!jtogglebutton1.isselected()) punkter.addelement(e.getpoint()); jpanel2.repaint(); Design: vælg jpanel2, og ændr name til tegneplade Source: File/new class. extends java.awt.canvas. Kald klassen
101 TegnePlade. lav en paint() metode i TegnePlade (husk at importere alt som skal importeres Du kan kopiere fra StregApplet): Hvordan kommer TegnePlade til at kende Punkter? Lav en objektvariabel af typen StregApplet i TegnePlade klassen, og lav en konstruktør der tager et StregApplet objekt som parameter, og som sætter objektvariablen til parameteren. Gå tilbage til StregApplet og vælg Source. find objektvariablen tegneplade, og ændre dens type til TegnePlade: TegnePlade tegneplade = new TegnePlade(this); Nu kender TegnePladen altid sin applet, og kan dermed få fat i punkter vektoren.
102 StregApplet import java.awt.*; import java.awt.event.*; import java.applet.*; import java.util.*; import javax.swing.*; public class StregApplet extends Applet /////////////////////////////////////// Vector punkter=new Vector(); Canvas tegneplade; JPanel nedreknappanel = new JPanel(); JButton sletpunktknap = new JButton(); JToggleButton flytpunkterknap = new JToggleButton(); ////////////////////////////////////// boolean isstandalone = false; BorderLayout borderlayout1 = new BorderLayout(); /**Initialize the applet*/ public void init() try jbinit(); catch(exception e) e.printstacktrace(); /**Component initialization*/ private void jbinit() throws Exception this.setlayout(borderlayout1); sletpunktknap.settext("slet punkt"); sletpunktknap.addactionlistener(new java.awt.event.actionlistener() public void actionperformed(actionevent e) sletpunktknap_actionperformed(e); ); tegneplade = new TegnePlade(this); tegneplade.addmouselistener(new java.awt.event.mouseadapter() public void mouseclicked(mouseevent e) tegneplade_mouseclicked(e); public void mousereleased(mouseevent e) tegneplade_mousereleased(e); ); flytpunkterknap.settext("flyt punkter"); flytpunkterknap.addactionlistener(new java.awt.event.actionlistener() public void actionperformed(actionevent e) flytpunkterknap_actionperformed(e); ); tegneplade.addmousemotionlistener(new java.awt.event.mousemotionadapter() public void mousedragged(mouseevent e) tegneplade_mousedragged(e);
103 ); this.add(tegneplade, BorderLayout.CENTER); this.add(nedreknappanel, BorderLayout.SOUTH); nedreknappanel.add(flytpunkterknap, null); nedreknappanel.add(sletpunktknap, null); /**Main method*/ public static void main(string[] args) StregApplet applet = new StregApplet(); applet.isstandalone = true; Frame frame; frame = new Frame() protected void processwindowevent(windowevent e) super.processwindowevent(e); if (e.getid() == WindowEvent.WINDOW_CLOSING) System.exit(0); public synchronized void settitle(string title) super.settitle(title); enableevents(awtevent.window_event_mask); ; frame.settitle("applet Frame"); frame.add(applet, BorderLayout.CENTER); applet.init(); applet.start(); frame.setsize(400,320); Dimension d = Toolkit.getDefaultToolkit().getScreenSize(); frame.setlocation((d.width frame.getsize().width) / 2, (d.height frame.getsize().height) / 2); frame.setvisible(true); /////////////////////////////////////////////// void tegneplade_mouseclicked(mouseevent e) if (!flytpunkterknap.isselected()) punkter.addelement(e.getpoint()); tegneplade.repaint(); void sletpunktknap_actionperformed(actionevent e) if (punkter.size()>0) punkter.removeelementat(punkter.size() 1); tegneplade.repaint(); int punktsize=5; Point flytpunkt=null; void tegneplade_mousedragged(mouseevent e) if (flytpunkterknap.isselected()) if(flytpunkt==null) for (int i=0;i<punkter.size();i++) Point p=(point)punkter.elementat(i); Rectangle r=new Rectangle(p.x punktsize,p.y punktsize,punktsize*2,punktsize*2); if (r.contains(e.getpoint())) flytpunkt=p;
104 if(flytpunkt!=null) flytpunkt.x=e.getpoint().x; flytpunkt.y=e.getpoint().y; tegneplade.repaint(); void tegneplade_mousereleased(mouseevent e) flytpunkt=null; void flytpunkterknap_actionperformed(actionevent e) tegneplade.repaint(); TegnePlade import java.awt.canvas; import java.awt.*; import java.applet.*; import java.util.*; import javax.swing.*; public class TegnePlade extends Canvas public void paint(graphics g) for (int i=1;i<applet.punkter.size();i++) Point p1=(point) applet.punkter.elementat(i 1); Point p2=(point) applet.punkter.elementat(i); g.drawline(p1.x,p1.y,p2.x,p2.y); if (applet.flytpunkterknap.isselected()) for (int i=0;i<applet.punkter.size();i++) Point p=(point) applet.punkter.elementat(i); g.drawrect(p.x applet.punktsize,p.y applet.punktsize, applet.punktsize*2,applet.punktsize*2); StregApplet applet; public TegnePlade(StregApplet ap) applet=ap; public TegnePlade()
105 Lektion 11 Interfaces Eventuelt: Serialisering af objekter Eventuelt: Netværkskommunikation Vejledning i obligatorisk opgave Interface En klasse kan begrebsmæssigt opdeles i: 1)Grænsefladen hvordan objekterne kan bruges udefra. Dette udgøres af navnene på metoderne, der kan ses udefra. 2)Implementationen hvordan objekterne virker indeni. Dette udgøres af variabler og programkoden i metodekroppene. Et interface svarer til punkt 1): En definition af, hvordan objekter bruges udefra. Man kan sige, at et interface er en "halv" klasse. Et interface er en samling navne på metoder (uden krop) import java.awt.*; public interface Tegnbar public void sætposition(int x, int y); public void tegn(graphics g);
106 Implementere et interface Lad os nu definere en klasse, der implementerer Tegnbar interfacet. En klasse kan erklære, at den implementerer et interface, og så skal den definere alle metoderne i interfacet og give dem en metodekrop Vi skal altså definere alle interfacets metoder sammen med programkoden, der beskriver hvad der skal ske, når metoderne kaldes. import java.awt.*; public class Stjerne implements Tegnbar private int posx, posy; public void sætposition(int x, int y) // kræves af Tegnbar posx = x; posy = y; public void tegn(graphics g) // kræves af Tegnbar g.drawstring("*",posx,posy); Variabler Tegnbar t; t = new Stjerne(); t = new Tegnbar(); // Lovligt, Stjerne implementerer Tegnbar // FEJL! Tegnbar er ikke en klasse t.sætposition(5,5); // OK, da Tegnbare objekt har metoden
107 Flere eksempler med Tegnbar interfacet public class GrafiskTerning extends Terning implements Tegnbar public class GrafiskRaflebaeger extends Raflebaeger implements Tegnbar En hvilken som helst klasse kan gøres til at være Tegnbar. Her er et tegnbart rektangel: import java.awt.*; public class Rektangel extends Rectangle implements Tegnbar public Rektangel(int x1, int y1, int width1, int height1) super(y1,x1,width1,height1); public void sætposition(int x1, int y1) x = x1; y = y1; public void tegn(graphics g) g.drawrect(x,y,width,height); Polymorfi Tegnbar t; t = new Stjerne(); t = new GrafiskTerning(); t = new GrafiskRaflebaeger(); t = new Rektangel();... t.sætposition(5,5);
108 En applet af tegnbare objekter import java.applet.*; import java.awt.*; import java.util.*; public class TegnbareObjekter extends Applet Vector tegnbare = new Vector(); GrafiskRaflebaeger bæger = new GrafiskRaflebaeger(); public void paint(graphics g) super.paint(g); for (int n=0; n<tegnbare.size(); n++) Tegnbar t = (Tegnbar) tegnbare.elementat(n); t.tegn(g); public void sætpositioner() for (int n=0; n<tegnbare.size(); n++) Tegnbar t = (Tegnbar) tegnbare.elementat(n); int x = (int) (Math.random()*200); int y = (int) (Math.random()*200); t.sætposition(x,y); // polymorfi! // polymorfi! public void init() Stjerne s = new Stjerne(); tegnbare.addelement(s); tegnbare.addelement( new Rektangel(10,10,30,30) ); tegnbare.addelement( new Rektangel(15,15,20,20) ); GrafiskTerning t; t = new GrafiskTerning(); bæger.tilføj(t); tegnbare.addelement(t); t = new GrafiskTerning(); bæger.tilføj(t); tegnbare.addelement(t); tegnbare.addelement(bæger); sætpositioner(); // mere kode her //... // flere metoder her //...
109 Interfaces i standardbibliotekerne. Sortering med Comparable public class Element implements Comparable int x; public Element(int x1) x = x1; public String tostring() return "element"+x; public int compareto(object obj) // kræves af Comparable Element andetelement = (Element) obj; if (x == andetelement.x) return 0; if (x > andetelement.x) return 1; else return 1; Collections.sort() kan sortere lister af Comparable objekter import java.util.*; public class BrugElementer public static void main(string args[]) Vector liste = new Vector(); liste.addelement( new Element(5)); liste.addelement( new Element(3)); liste.addelement( new Element(13)); liste.addelement( new Element(1)); System.out.println("før: "+liste); Collections.sort(v); System.out.println("efter: "+liste); før: [element5, element3, element13, element1] efter: [element1, element3, element5, element13]
110 Serialisering import java.io.*; public class Data implements Serializable public int a; public transient int tmp; public String tostring() return "Data: a="+a+" tmp="+tmp; import java.util.*; public class HentOgGemData public static void main(string arg[]) throws Exception Vector v; try v = (Vector) Serialisering.hent("data.ser"); System.out.println("Indlæst: "+v); catch (Exception e) v = new Vector(); System.out.println("Oprettet: "+v); Data d = new Data(); d.a = (int) (Math.random()*100); d.tmp = (int) (Math.random()*100); v.addelement(d); System.out.println("Gemt: "+v); Serialisering.gem(v,"data.ser"); Oprettet: [] Gemt: [Data: a=88 tmp=2] Køres programmet igen fås: Læst: [Data: a=88 tmp=0] Gemt: [Data: a=88 tmp=0, Data: a=10 tmp=10] Læst: [Data: a=88 tmp=0, Data: a=10 tmp=0] Gemt: [Data: a=88 tmp=0, Data: a=10 tmp=0, Data: a=52 tmp=96] Læst: [Data: a=88 tmp=0, Data: a=10 tmp=0, Data: a=52 tmp=0] Gemt: [Data: a=88 tmp=0, Data: a=10 tmp=0, Data: a=52 tmp=0, Data: a=78 tmp=88] Læg mærke til, at den transiente variabel tmp ikke bliver husket fra gang til gang.
111 Kassen Serialisering er en hjælpeklasse med to metoder, der hhv. henter og gemmer objekter i en fil. Du kan benytte klassen fra dine egne programmer. import java.io.*; public class Serialisering public static void gem(object obj, String filnavn) throws IOException FileOutputStream datastrøm = new FileOutputStream(filnavn); ObjectOutputStream p = new ObjectOutputStream(datastrøm); p.writeobject(obj); p.close(); public static Object hent(string filnavn) throws Exception FileInputStream datastrøm = new FileInputStream(filnavn); ObjectInputStream p = new ObjectInputStream(datastrøm); Object obj = p.readobject(); p.close(); return obj;
112 Netværkskommunikation Kommunikation mellem to maskiner sker ved, at værtsmaskinen gør en tjeneste tilgængelig på en bestemt port, hvorefter klienter kan oprette en forbindelser til tjenesten. Klient program Væ rt 21 FTP 23 telnet 80 HTTP egen tjeneste Hjemmesider (HTTP tjenesten) er tilgængelige på port 80.
113 En klient (der henter en hjemmeside) import java.io.*; import java.net.*; public class HentHjemmeside public static void main(string arg[]) try Socket forbindelse = new Socket(" OutputStream fraos = forbindelse.getoutputstream(); InputStream tilos = forbindelse.getinputstream(); PrintWriter ud = new PrintWriter(fraOs); BufferedReader ind = new BufferedReader(new InputStreamReader(tilOs)); ud.println("get / HTTP/0.9"); ud.println("host: ud.println(); ud.flush(); // send anmodning afsted til værten String s = ind.readline(); while (s!= null) // null når datastrømmen lukkes System.out.println("svar: "+s); s = ind.readline(); forbindelse.close(); catch (Exception e) e.printstacktrace(); svar: HTTP/ OK svar: Date: Tue, 17 Apr :06:06 GMT svar: Server: Apache/ (Unix) (Red Hat/Linux) PHP/4.0.2 mod_perl/1.24 svar: Content Length: 896 svar: Content Type: text/html svar: svar: <HTML><HEAD><TITLE>Esperanto.dk</TITLE> svar: <META name="keywords" content="esperanto, Danmark, Esperanto nyt, plansprog, kunstsprog, lingvistik, videnskab, debat, Zamenhof, Danio, libroservo, planlingvo, teknika lingvo, lingvistiko, debato"> svar: </HEAD> svar: <h1>velkommen til Esperanto.dk!</h1> svar: Gå til <a href="da/velkomst.htm">velkomst siden</a> svar: eller til <a href="da/menu.htm">indholdsfortegnelsen</a>, svar: </html> Bemærk: Netop hjemmesider hentes nemmest med URL klassen: URL url = new URL(" url.getinputstream();
114 En vært, der "serverer" hjemmesider import java.io.*; import java.net.*; public class Hjemmesidevaert public static void main(string arg[]) try ServerSocket værtssokkel = new ServerSocket(8001); while (true) Socket forb = værtssokkel.accept(); PrintWriter ud = new PrintWriter(forb.getOutputStream()); BufferedReader ind = new BufferedReader( new InputStreamReader(forb.getInputStream())); String anmodning = ind.readline(); System.out.println("Anmodning: "+anmodning); ud.println("http/ OK"); ud.println(); ud.println("<html><head><title>svar</title></head>"); ud.println("<body><h1>kære bruger</h1>"); ud.println("du har spurgt om "+anmodning+"."); ud.println("</body></html>"); ud.flush(); forb.close(); catch (Exception e) e.printstacktrace(); Anmodning: GET / HTTP/0.9 Anmodning: GET / HTTP/1.1 Anmodning: GET /xxx.html HTTP/1.1
115 Flertrådet programmering public class SnakkesagligPerson implements Runnable private String navn; private int ventetid; public SnakkesagligPerson(String n, int t) navn = n; ventetid = t; public void run() for (int i=0; i<5; i++) System.out.println(navn+": bla bla bla "+i); try Thread.sleep(ventetid); catch (Exception e) public class BenytSnakkesagligePersoner public static void main(string arg[]) SnakkesagligPerson p = new SnakkesagligPerson("Jacob",150); Thread t = new Thread(p); // Ny tråd, klar til at køre t.start(); //.. Nu starter personen med at snakke... p = new SnakkesagligPerson("Troels",400); t = new Thread(p); t.start(); // Det kan også gøres mere kompakt: new Thread(new SnakkesagligPerson("Henrik",200)).start(); Jacob: bla bla bla 0 Troels: bla bla bla 0 Henrik: bla bla bla 0 Jacob: bla bla bla 1 Henrik: bla bla bla 1 Jacob: bla bla bla 2 Troels: bla bla bla 1 Henrik: bla bla bla 2 Jacob: bla bla bla 3 Henrik: bla bla bla 3 Jacob: bla bla bla 4 Troels: bla bla bla 2 Henrik: bla bla bla 4 Troels: bla bla bla 3 Troels: bla bla bla 4 En flertrådet webserver import java.io.*;
116 import java.net.*; import java.util.*; public class Anmodning implements Runnable private Socket forbindelse; Anmodning(Socket forbindelse) this.forbindelse = forbindelse; public void run() try PrintWriter ud = new PrintWriter(forbindelse.getOutputStream()); BufferedReader ind = new BufferedReader( new InputStreamReader(forbindelse.getInputStream())); String anmodning = ind.readline(); System.out.println("start "+new Date()+" "+anmodning); ud.println("http/ OK"); ud.println(); ud.println("<html><head><title>svar</title></head>"); ud.println("<body><h1>svar</h1>"); ud.println("tænker over "+anmodning+"<br>"); for (int i=0; i<100; i++) ud.print(".<br>"); ud.flush(); Thread.sleep(100); ud.println("nu har jeg tænkt færdig!</body></html>"); ud.flush(); forbindelse.close(); System.out.println("slut "+new Date()+" "+anmodning); catch (Exception e) e.printstacktrace();
117 import java.io.*; import java.net.*; public class FlertraadetHjemmesidevaert public static void main(string arg[]) try ServerSocket værtssokkel = new ServerSocket(8001); while (true) Socket forbindelse = værtssokkel.accept(); Anmodning a = new Anmodning(forbindelse); new Thread(a).start(); catch (Exception e) e.printstacktrace(); start Tue Nov 28 15:37:31 GMT+01: GET /xxx.html HTTP/1.0 start Tue Nov 28 15:37:38 GMT+01: GET /yyy.html HTTP/1.0 start Tue Nov 28 15:37:42 GMT+01: GET /zzz.html HTTP/1.0 slut Tue Nov 28 15:37:42 GMT+01: GET /xxx.html HTTP/1.0 slut Tue Nov 28 15:37:49 GMT+01: GET /yyy.html HTTP/1.0 start Tue Nov 28 15:37:50 GMT+01: GET /qqq.html HTTP/1.0 slut Tue Nov 28 15:37:53 GMT+01: GET /zzz.html HTTP/1.0 slut Tue Nov 28 15:38:01 GMT+01: GET /qqq.html HTTP/1.0
118
119 Lektion 12 Hændelser Klassevariabler og variablers virkefelt Arrays Evt. intro til flertrådet programmering Efterfølgende ITD kurser Trinvis gennemgang (det skal I prøve i kurset her!)
120 Hændelser Når brugeren foretager en handling, f.eks. bevæger musen, klikker, trykker en knap ned, ændrer i et tekstfelt osv., opstår der en hændelse. Hvis man vil behandle en bestemt type hændelser fra en komponent, skal man lytte efter den hændelse. Det gøres ved at registrere en lytter på komponenten. Program lytter implementerer MouseListener addmouselistener(lytter) lytter.mouseclicked() System grafisk komponent (appletten) Lytte efter muse hændelser på en applet: import java.applet.*; public class LytTilMusen extends Applet public void init() Muselytter lytter = new Muselytter(); this.addmouselistener(lytter); // this er appletten selv
121 Lytteren skal i dette tilfælde implementere interfacet MouseListener import java.awt.*; import java.awt.event.*; public class Muselytter implements MouseListener public void mousepressed(mouseevent hændelse) Point trykpunkt = hændelse.getpoint(); System.out.println("Mus trykket ned i "+trykpunkt); public void mousereleased(mouseevent hændelse) Point slippunkt = hændelse.getpoint(); System.out.println("Mus sluppet i "+slippunkt); public void mouseclicked(mouseevent hændelse) System.out.println("Mus klikket i "+hændelse.getpoint()); // Ubrugte hændelser // (skal defineres for at implementere MouseListener) public void mouseentered (MouseEvent event) public void mouseexited (MouseEvent event) Uddata fra apletten kan ses i konsolvinduet (Netscape: Communcator/Tools/Java Console): Mus trykket ned i java.awt.point[x=132,y=209] Mus sluppet i java.awt.point[x=139,y=251] Mus trykket ned i java.awt.point[x=101,y=199] Mus sluppet i java.awt.point[x=101,y=199] Mus klikket i java.awt.point[x=101,y=199]
122 Linietegning Hvordan får vi information fra lytteren til appletten? import java.awt.*; import java.awt.event.*; import java.applet.*; public class Linietegning extends Applet public Point trykpunkt; public Point slippunkt; public void init() Linielytter lytter = new Linielytter(); // initialiserer lytterens reference til appletten lytter.appletten = this; this.addmouselistener(lytter); public void paint(graphics g) g.drawstring("1:"+trykpunkt+" 2:"+slippunkt,10,10); if (trykpunkt!= null && slippunkt!= null) g.setcolor(color.blue); g.drawline(trykpunkt.x,trykpunkt.y,slippunkt.x, slippunkt.y); import java.awt.*; import java.awt.event.*; import java.applet.applet; public class Linielytter implements MouseListener public Linietegning appletten; public void mousepressed(mouseevent hændelse) appletten.punkt1 = hændelse.getpoint(); public void mousereleased(mouseevent hændelse) appletten.punkt2 = hændelse.getpoint(); appletten.repaint(); // // Ubrugte hændelser (skal defineres for at implementere interfacet) // public void mouseclicked(mouseevent event) // kræves af MouseListener public void mouseentered(mouseevent event) // kræves af MouseListener public void mouseexited (MouseEvent event) // kræves af MouseListener
123 Tekstredigering import java.applet.*; import java.awt.*; import java.awt.event.*; public class LytTilKnap extends Applet implements ActionListener private TextArea t1, t2; private Button kopierknap; public void init() String s = "Her er en tekst.\nmarkér noget og tryk Kopier..."; t1 = new TextArea(s, 5,20); add(t1); kopierknap = new Button("Kopiér>>"); kopierknap.addactionlistener(this); add(kopierknap); t2 = new TextArea( 5,20); t2.seteditable(false); add(t2); // kræves af ActionListener public void actionperformed(actionevent e) t2.settext(t1.getselectedtext() );
124 JBuilder Værktøjet genererer i jbinit() koden: buttonkast.addactionlistener( new java.awt.event.actionlistener() public void actionperformed(actionevent e) buttonkast_actionperformed(e); ); Det er en anonym indre klasse der implementerer ActionListener() interfacet, der bliver tilføjet som lytter til buttonkast. Den anonyme klasse har kun én metode (actionperformed), og der sker kun én ting, nemlig at buttonkast_actionperformed bliver kaldt. Den er defineret andetsteds i koden, og her kan vi sætte vores kode ind: void buttonkast_actionperformed(actionevent e) // vores programkode her...
125 Arrays Et array er en række data af samme type public class ArrayEksempel1 public static void main(string[] args) int[] arr = new int[6]; arr[0] = 28; arr[2] = 13; arr[3] = arr[0] + arr[1] + arr[2]; int længde = arr.length; for (int i=0; i<længde; i=i+1) System.out.print( arr[i] + " " ); System.out.println();
126 Initialisering med startværdier public class Maaneder public static void main(string[] args) int[]måneder= 31,28,31,30,31,30,31,31,30,31,30,31; System.out.println("Længden af januar er: " + måneder[0]); System.out.println("Længden af april er: " + måneder[3]); for (int i=0; i < måneder.length; i=i+1) System.out.print(måneder[i] + ", "); System.out.println(); Længden af januar er: 31 Længden af april er: 30 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31, Arrays af objekter public class MaanedersNavne public static void main(string[] args) String[] måneder = "januar", "februar", "marts", "april", "maj", "juni", "juli", "august", "september", "oktober", "november", "december" ; System.out.println("Den 1. måned er " + måneder[0] ); System.out.println("Den 6. måned er " + måneder[5] ); System.out.println("Den 9. måned er " + måneder[9] ); Den 1. måned er januar Den 6. måned er juni Den 9. måned er oktober
127 Lokale, objekt og klassevariable public class Boks4 private double længde; // objektvariabel private double bredde; private double højde; private static int antalbokse; // objektvariabel // objektvariabel // klassevariabel public Boks4(double l, double b, double h) // l, b og h er lokale variabler længde = l; bredde = b; højde = h; antalbokse = antalbokse + 1; public static int læsantalbokse() // klassemetode return antalbokse; public double volumen() // vol er en lokal variabel double vol; vol = længde*bredde*højde; return vol; public class BenytBoks4 public static void main(string args[]) Boks antalbokse :int læ ngde :double bredde :double h jde :double +Boks(l,b,h) +læ santalbokse(): int +volumen() :double System.out.println("Antal bokse: "+ Boks4.læsAntalBokse()); Boks4 boksen; boksen = new Boks4(2,5,10); System.out.println("Antal bokse: "+ Boks4.læsAntalBokse()); Boks4 enandenboks, entredjeboks; enandenboks = new Boks4(5,5,10); entredjeboks = new Boks4(7,5,10); System.out.println("Antal bokse: "+ Boks4.læsAntalBokse()); Antal bokse: 0 Antal bokse: 1 Antal bokse: 3
128 Variabler erklæret static kaldes statiske variabler eller klassevariable. Metoder erklæret static kaldes statiske metoder eller klassemetoder. Vi har brug for statiske metoder og variabler i 2 tilfælde: Hvis vi ønsker at have fælles variabler for samtlige objekter af en klasse. Hvis vi ønsker at kunne anvende variabler eller metoder uden at skulle lave nye objekter. Tilknytning Objektvariabler og metoder er altid tilknyttet et konkret objekt, oprettet med f.eks. boksen = new Boks(). En klassevariabel eksisterer kun ét sted i hukommelsen, uanset hvor mange objekter der oprettes, og alle objekterne deler klassevariablen. Klassemetoder og variabler er ikke tilknyttet noget konkret objekt og kan altid anvendes.
129 Adgang til variabler og metoder Objektvariabler anvendes uden for objektet ved at skrive objektnavn.variabel. Objektmetoder anvendes uden for klassen ved at skrive objektnavn.metode(), f.eks. boksen.volumen() Klassevariabler anvendes uden for klassen ved at skrive Klassenavn.variabel. Klassemetoder anvendes uden for klassen ved at skrive Klassenavn.metode(), f.eks. Boks.læsAntalBokse() Adgang fra metoder Almindelige metoder kan uden videre anvende andre metoder, variabler, klassemetoder og klassevariable. Klassemetoder kan kun anvende klassemetoder og klassevariable. De kan ikke anvende objektvariabler eller metoder (til disse skal der være et objekt).
130 Lektion 13
131 Lektion 14
132 public, protected og private Variabler og metoder erklæret public er altid tilgængelige, både inden og uden for klassen. Variabler og metoder erklæret protected er tilgængelige for alle klasser inden for samme pakke. Klasser i andre pakker kan kun få adgang hvis de er nedarvinger. Skriver man ingenting er det kun klasser i samme pakke der har adgang til variablen eller metoden. private er det mest restriktive. Hvis en variabel eller metode er erklæret private, kan den kun benyttes indenfor samme klasse (og derfor kan den ikke tilsidesættes med nedarving). Adgang public protected (ingenting) private i samme klasse ja ja ja ja klasse i samme pakke ja ja ja nej arving i en anden pakke ja ja nej nej klasse der ikke arver i en anden pakke ja nej nej nej Holder man sig inden for samme pakke er der altså ingen forskel mellem public, protected og ingenting.
133 Nøgleordet final En variabel der er erklæret final kan ikke ændres når den først har fået en værdi. public class X public final int a=10; //.. Herover kan a s værdi ikke ændres. final styrer ikke synlighed, men kan bruges sammen med public, protected og private. Det kan også bruges på lokale variable (hvor public, protected og private aldrig kan bruges): public static void main(string args[]) final Vector v = new Vector(); //v = new Vector(); // ulovligt! v kan ikke ændres. public static void main(string args[]) final Vector v = new Vector(); // lovligt, v refererer stadig til samme objekt v.addelement("hans");
134 Nøgleordet abstract Noget der er erklæret abstract er ikke implementeret, og skal defineres i en nedarving. Klasser public abstract class X public void a() //.. Det er forbudt at oprette objekter fra en abstrakt klasse public static void main(string args[]) X x = new X(); // ulovligt! X er abstrakt Metoder En metode erklæret abstract har kun et metodehovede men ingen krop. Den kan kun erklæres i en abstrakt klasse public abstract class X public abstract void a(); Nedarvinger skal definere de abstrakte metoder, eller selv også være abstrakte public class Y extends X public void a() //..
135
136 Indre klasser (Almindelige) indre klasser Lokale klasser Anonyme klasser Almindelige indre klasser public class YdreKlasse class AlmindeligIndreKlasse Koden i den indre klasse kan derfor anvende alle den ydre klasses variabler og metoder også de private. Den er altid knyttet til en forekomst af den ydre klasse.
137 Eksempel Linietegning import java.applet.applet; import java.awt.*; import java.awt.event.*; public class LinietegningIndre extends Applet private Point trykpunkt = null; private Point slippunkt = null; public void init() Linielytter lytter = new Linielytter(); this.addmouselistener(lytter); // En indre klasse class Linielytter implements MouseListener public void mousepressed (MouseEvent event) // sæt den ydre klasses variabel trykpunkt = event.getpoint(); public void mousereleased (MouseEvent event) slippunkt = event.getpoint(); repaint(); // kald den ydre klasses metode // kræves af MouseListener: public void mouseclicked (MouseEvent event) public void mouseentered (MouseEvent event) public void mouseexited (MouseEvent event) // slut på indre klasse // en metode i den ydre klasse public void paint (Graphics g) if (trykpunkt!= null && slippunkt!= null) g.drawline (trykpunkt.x, trykpunkt.y, slippunkt.x, slippunkt.y); Læg mærke til at den indre klasse uden videre har adgang til den ydre klasses variabler og metoder. Lokale klasser En lokal klasse er defineret i en blok programkode, ligesom en lokal variabel.
138 public class YdreKlasse public void metode() //... class LokalKlasse // metoder og variabler her... LokalKlasse objektaflokalklasse = new LokalKlasse(); //...
139 public class YdreKlasseMedLokalKlasse private char c = c ; private char d = d ; public void prøvlokaltobjekt(final char e) final char f= f ; class LokalKlasse char g = g ; public void udskriv() System.out.println( g ); System.out.println( f ); System.out.println( e ); System.out.println( d ); System.out.println( c ); // slut på lokal klasse LokalKlasse lokal = new LokalKlasse(); lokal.udskriv(); public static void main(string args[]) YdreKlasseMedLokalKlasse ydre = new YdreKlasseMedLokalKlasse(); ydre.prøvlokaltobjekt( e ); g f e d c
140 Anonyme klasser En anonym klasse er en lokal klasse uden klassenavn, som der oprettes netop ét objekt ud fra: public class YdreKlasse public void metode() //... programkode for metode() X objektafanonymklasse = new X() void metodeianonymklasse() // programkode // flere metoder og variabler i anonym klasse objektafanonymklasse.metodeianonymklasse(); // mere programkode for metode()
141 Eksempel filtrering af filnavne import java.io.*; public class FilnavnfiltreringMedAnonymKlasse public static void main(string arg[]) File f = new File( "." ); FilenameFilter filter; filter = new FilenameFilter() // En anonym klasse public boolean accept( File f, String s) return s.endswith( ".java"); // slut på klassen; ; // slut på tildelingen filter = new... // brug objektet som filter i en liste af filer String[] list = f.list( filter ); for (int i=0; i<list.length; i=i+1) System.out.println( list[i] ); IndreKlasser1.java A.java FilnavnfiltreringMedAonymKlasse.java LinietegningAnonym.java YdreKlasseMedLokalKlasse.java LinietegningIndre.java
142 Eksempel Linietegning Udviklingsværktøjer benytter ofte anonyme klasser i forbindelse med at lytte efter hændelser. Her er Linietegning eksemplet igen hvor vi bruger en anonym klasse som lytter. import java.applet.applet; import java.awt.*; import java.awt.event.*; public class LinietegningAnonym extends Applet private Point trykpunkt = null; private Point slippunkt = null; public void init() this.addmouselistener( new MouseListener() public void mousepressed (MouseEvent event) trykpunkt = event.getpoint(); public void mousereleased (MouseEvent event) slippunkt = event.getpoint(); repaint(); public void mouseclicked (MouseEvent event) public void mouseentered (MouseEvent event) public void mouseexited (MouseEvent event) // slut på anonym klasse ); // slut på kald til addmouselistener() System.out.println("Lytter objekt oprettet"); public void paint (Graphics g) if (trykpunkt!= null && slippunkt!= null) g.drawline (trykpunkt.x, trykpunkt.y, slippunkt.x, slippunkt.y);
143 Eksempel tråde Her opretter vi 5 tråde som anonyme klasser. Der oprettes ét tråd objekt per gennemløb af for løkken public class AnonymeTraade public static void main(string arg[]) for (int i=0; i<5; i++) final prioritet = i; Thread t = new Thread() public void run() setpriority(thread.min_priority + prioritet); char tegn = a + prioritet; for (int j=0; j<50; j=j+1) System.out.print(tegn); System.out.print("Færdig med "+tegn+"."); t.start();
Kursus i OOP og Java. Kursus i Objektorienteret programmering i Java
Kursus i OOP og Java Kursus i Objektorienteret programmering i Java Åben Dokumentlicens Dette foredragsmateriale er under Åben Dokumentlicens (ÅDL) Du har derfor lov til frit at kopiere dette værk Bruger
Videregående programmering i Java
Videregående programmering i Java Dag 6 Komponenter (og lidt Swing og MVC) Læsning: VP 4, evt. VP 6 Dette materiale er under Åben Dokumentlicens, se http://www.sslug.dk/linuxbog/licens.html Grafiske komponenter
Jacob Nordfalk. Ingeniørhøjskolen i København. Nykøbing F itvisioncenter 24. februar 2004
Genbrugelige komponenter og designmønstre i Java Jacob Nordfalk Ingeniørhøjskolen i København Nykøbing F itvisioncenter 24. februar 2004 Program Om Jacob Nordfalk introduktion (ikke-teknisk del) Komponentbaseret
//Udskriver System.out.println("Hej " + ditfornavn + " " + ditefternavn + "."); System.out.println("Du er " + dinalder + " aar gammel!
Denne guide er oprindeligt udgivet på Eksperten.dk Brugerinput i Java Denne her artikel gennemgår diverse ting ved brug af brugerinput i Java. Den starter med det simple og fortæller derefter skridt for
University of Southern Denmark Syddansk Universitet. DM502 Forelæsning 2
DM502 Forelæsning 2 Repetition Kompilere og køre Java program javac HelloWorld.java java HeloWorld.java Debugge Java program javac -g HelloWorld.java jswat Det basale Java program public class HelloWorld
AAU, Programmering i Java Intern skriftlig prøve 18. maj 2007
AAU, Programmering i Java Intern skriftlig prøve 18. maj 2007 Opgavebesvarelsen skal afleveres som enten en printerudskrift eller som et passende dokument sendt via email til [email protected]. Besvarelsen skal
Ugeseddel 4 1. marts - 8. marts
Ugeseddel 4 1. marts - 8. marts Læs følgende sider i kapitel 6 i lærebogen: s. 233 258 og s. 291 317 (afsnit 6.3 overspringes). Begynd at overveje, hvad afleveringsopgaven skal omhandle. Læs vejledningen,
Grundlæggende Programmering ITU, Efterår 1999. Skriftlig eksamen i Grundlæggende Programmering
Skriftlig eksamen i Grundlæggende Programmering ITU, 20. januar 2000 Alle hjælpemidler tilladt, dog ikke datamat. Eksamen er skriftlig, fire timer, og bedømmes efter 13-skalaen. Opgavesættet består af
University of Southern Denmark Syddansk Universitet. DM503 Forelæsning 11
DM503 Forelæsning 11 Generics Pakker Exceptions Indhold Generics Nedarvning og Generics Generics Nedarvning og Generics Husk Box fra sidst Generics public class Box {! private T object;! public void
Java Programmering. En bog for begyndere. Skrevet af Henrik Kressner
Java Programmering En bog for begyndere Skrevet af Henrik Kressner Indholdsfortegnelse Introduktion...3 1 Introduktion til Java...4 1.1 Javakoden...4 1.2 Det første program...6 1.2 Skriv til skærmen...6
Programmering i C. Lektion 4. 5. december 2008
Programmering i C Lektion 4 5. december 2008 Funktioner Eksempel Fra sidst 1 Funktioner 2 Eksempel Funktioner Eksempel Eksempel: 1 / f u n k t i o n s p r o t o t y p e r / i n t i n d l a e s ( void )
DANMARKS TEKNISKE UNIVERSITET
DANMARKS TEKNISKE UNIVERSITET Skriftlig prøve, 14. december 2018, 4 timer Side 1 af 18 Kursus navn: 02101 Indledende Programmering Kursus : 02101 Tilladte hjælpemidler: Ikke-digitale skriftlige hjælpemidler
Videregående programmering i Java
Videregående programmering i Java VPJ dag 1 Introduktion og overblik over kurset Datastrukturer: Lister, mængder og iteratorer Opsamling: Grafikprogrammering, komponenter, containere og layout Bruge komponenter
Eksamens spørgsmål i Java HTML - DataBase 3. Semester (i)
Eksamens spørgsmål i Java HTML - DataBase 3. Semester (i) 1: KLASSE METODE KONSTRUKTØR EKS. PÅ TYPE (VARIABLE) PUBLIC/PRIVATE OBJECT UD FRA KLASSE KALD METODE TILFØR PARAMETER TIL METODE RETURNERE VARIBEL.
Skriftlig eksamen i Datalogi
Roskilde Universitetscenter side 1 af 9 sider Skriftlig eksamen i Datalogi Modul 1 Vinter 1999/2000 Opgavesættet består af 6 opgaver, der ved bedømmelsen tillægges følgende vægte: Opgave 1 5% Opgave 2
Programmering. Udvidet Programmering. Kurserne. Kurset: programmering i sproget Java. Lærerne: Morten Larsen og Peter Sestoft
Kurserne Kurset: programmering i sproget Java Programmering og Udvidet Programmering Lærerne: Morten Larsen og Peter Sestoft Kursusmål: I skal lære at skrive interessante programmer i Java Forudsætninger:
Del filer i hjemmet. Hvis dit hjem har to eller. 5-10 min. NY SERIE
DEL DET HELE I denne artikelserie lærer du de bedste og letteste metoder til at dele filer, printere og internetforbindelse med andre både på dit netværk i hjemmet og via internettet. Del filer i hjemmet
Kom godt igang med Inventar registrering
Kom godt igang med Inventar registrering (InventoryDB) (Med stregkodesupport) programmet fra PetriSoft Introduktion... 1 Inventar registrering... 2 Værktøjsudleje... 3 Service database til reperationer
University of Southern Denmark Syddansk Universitet. DM502 Forelæsning 3
DM502 Forelæsning 3 Indlæsning fra tastatur Udskrift til skærm Repetition Beregning af middelværdi Gentagelse med stop-betingelse (while) Heltalsdivision Division med nul Type-casting ( (double) ) Betinget
Indledning. Hvorfor det forholder sig sådan har jeg en masse idéer om, men det bliver for meget at komme ind på her. God fornøjelse med læsningen.
Indledning...2 Variabler...13 Eksempel: 1...13 Eksempel 2:...13 Eksempel 3:...15 Eksempel 4:...16 Metoder...17 Metode (intet ind og intet ud)...17 Metode (tekst ind)...18 Metode (tekst ind og tekst ud)...19
IFC Egenskaber. Mohammad Hussain Parsianfar s102951 BYG DTU
Mohammad Hussain Parsianfar s102951 Indholdsfortegnelse 1 Introduktion... 3 1.1 Hvorfor er det interessant... 3 1.2 Formål... 4 2 Simplebim... 5 2.1 Præsentation af softwaren... 5 2.1.1 Brugergrænseflade...
Tree klassen fra sidste forelæsning
Programmering 1999 Forelæsning 12, fredag 8. oktober 1999 Oversigt Abstrakte klasser. Grænseflader. Programmering 1999 KVL Side 12-1 Tree klassen fra sidste forelæsning class Tree { int age; // in years
i x-aksens retning, så fås ). Forskriften for g fås altså ved i forskriften for f at udskifte alle forekomster af x med x x 0
BAndengradspolynomier Et polynomium er en funktion på formen f ( ) = an + an + a+ a, hvor ai R kaldes polynomiets koefficienter. Graden af et polynomium er lig med den højeste potens af, for hvilket den
MySQL i Java. Tutorial lavet af Jákup W. Hansen TSU 2006 2.semester 05.januar 2007
MySQL i Java Tutorial lavet af Jákup W. Hansen TSU 2006 2.semester 05.januar 2007 Hvad er MySQL? Det er et database system, som er gratis for os at bruge. Det er lidt mere besværligt i starten at bruge
Eksempel på en database: studenter, kurser, eksamener
Udvidet Programmering 1999 Forelæsning 20, fredag 12. november 1999 Relationsdatabaser: relationer, tupler, attributter Forespørgselssproget SQL Databasesystemet PostgreSQL Tilgang til relationsdatabaser
Adobe Elements Lektion 2
Adobe Elements Lektion 2 Så er det igen tid til at lege lidt med billeder. Jeg går ud fra, at du nu har fået opsat Elements efter de anvisninger du fik i sidste lektion. Start Elements op Gå ind i Edit
Dag 10 Flertrådet programmering
Videregående programmering i Java Dag 10 Flertrådet programmering Fremlæggelse af programmering/status for projekter Dokumentation med javadoc Flertrådede designmønstre: Arbejdstråd, Producent Konsument,
Software Construction 1 semester (SWC) Spørgsmål 1
Spørgsmål 1 Objekter #1 Giv en kort præsentation af begrebet objekt, samt hvorledes du erklærer(declare), opretter(create) og bruger objekter Du kan beskrive o Datatyper o Variable / Instans variable /
Kursus navn: Indledende programmering Kursus nr. 02101
Danmarks Tekniske Universitet Side 1 af 8 sider Skriftlig prøve, den 15. december 2007 Kursus navn: Indledende programmering Kursus nr. 02101 Tilladte hjælpemidler: Alle skriftlige hjælpemidler Vægtning
Tastevejledning Windows XP
Tastevejledning Windows XP Tastevejledningen dækker den danske udgave af Windows XP. Der er taget udgangspunkt i en standard installation, hvor der ikke er foretaget tilpasninger i skærmopsætning, valg
Allan C. Malmberg. Terningkast
Allan C. Malmberg Terningkast INFA 2008 Programmet Terning Terning er et INFA-program tilrettelagt med henblik på elever i 8. - 10. klasse som har særlig interesse i at arbejde med situationer af chancemæssig
Klasser og nedarvning
Datalogi C, Efterår 2004 OH er, forelæsning 21/9-2004 Klasser og nedarvning Hvad er formålet? Typer, generisk kode, typeparameterisering Kritisk kig på, hvordan man gør i Java. Opgaven til senere: Generalisere
Programmering I Java/C#
Programmering I Java/C# Dit første projekt Datatekniker Intro to C# C# (C Sharp) Et enkelt, moderne, generelt anvendeligt, objektorienteret programmeringssprog Udviklet af Microsoft, ledet af danskeren
BRP 6.9.2006 Kursusintroduktion og Java-oversigt
BRP 6.9.2006 Kursusintroduktion og Java-oversigt 1. Kursusintroduktion 2. Java-oversigt (A): Opgave P4.4 3. Java-oversigt (B): Ny omvendings -opgave 4. Introduktion til næste kursusgang Kursusintroduktion:
Databaseadgang fra Java
Databaseadgang fra Java Grundlæggende Programmering med Projekt Peter Sestoft Fredag 2007-11-23 Relationsdatabasesystemer Der er mange databaseservere Microsoft Access del af Microsoft Office MySQL god,
Test af It-komponent
Test af It-komponent I programmeringssproget Java Programmet Login service Elev: Mads Funch Klasse 2.4 Mat, It, Programmering Skole: Roskilde Tekniske Gymnasium HTX Underviser: Karl Dato: 31-08-2016 Side
02101 Indledende Programmering Introduktion til Eclipse
02101 Indledende Programmering Introduktion til Eclipse Version 2018 1 Introduktion I dette kursus lægger vi op til at man bruger det integrerede udviklingsmiljø Eclipse. Basalt set er et integreret udviklingsmiljø
VDI-GUIDE FOR AALESTRUP REALSKOLE
VDI-GUIDE FOR AALESTRUP REALSKOLE Af Martin Lohse Mikkelsen IT-vejleder - Side 1 af 37 Forord Dette dokument skal hjælpe dig med brugen af skolens VDI system. Et VDI-system er en virtuel computer, som
SWC eksamens-spørgsmål. Oversigt
SWC eksamens-spørgsmål Oversigt #1 Typer og variable #2 Aritmetik og logik #3 Klasser (definition, objekter) #4 Klasser (metoder) #5 Klasser (nedarvning, polymorfi) #6 Conditional statements #7 Repetition
JavaScript. nedarvning.
JavaScript er et sprog, der kan give en hjemmeside mere funktionalitet og gøre den interaktiv, så den reagerer på læsernes handlinger. CGI (Common Gateway Interface) har hidtil været de protokoller, man
IT Support Guide. Installation af netværksprinter (direkte IP print)
IT Support Guide Denne guide er hentet på www.spelling.dk Program: Microsoft Windows Vista Program sprog version: ENG (US) Guide emne: Installation af netværksprinter (direkte IP print) Publikationsnr.:
Videregående Programmering Obligatorisk opgave - 3. semester, efterår 2004
Overvågningssystem Beskrivelse Bagagesorteringssystemet består af et antal skranker (check-in) til modtagelse og registrering af bagage, et automatiseret sorteringsanlæg samt et antal terminaler (gates),
Videregående Programmering for Diplom-E Noter
Videregående Programmering for Diplom-E Noter 1. Uddelegering Ét af de væsentlige principper i objektorienteret programmering er, at enhver klasse selv skal kunne "klare ærterne". Enhver klasse skal altså
qwertyuiopåasdfghjklæøzxcvbnmqw ertyuiopåasdfghjklæøzxcvbnmqwert yuiopåasdfghjklæøzxcvbnmqwertyui Polynomier opåasdfghjklæøzxcvbnmqwertyuiopå
qwertyuiopåasdfghjklæøzxcvbnmqw ertyuiopåasdfghjklæøzxcvbnmqwert yuiopåasdfghjklæøzxcvbnmqwertyui Polynomier opåasdfghjklæøzxcvbnmqwertyuiopå Kort gennemgang af polynomier og deres egenskaber. asdfghjklæøzxcvbnmqwertyuiopåasd
Det sprogpædagogiske kørekort 2012/2013. Modul 9: Rettelse af kursistopgaver (Del 1)
Det sprogpædagogiske kørekort 2012/2013 Modul 9: Rettelse af kursistopgaver (Del 1) Christoph Schepers Indhold I Ret opgaver i Word Markér fejl i farver (nemt og hurtigt).. Brug Words egne retteværktøjer:
Hvad er Objekter - Programmering
Denne guide er oprindeligt udgivet på Eksperten.dk Hvad er Objekter - Programmering En rigtig god gennemgang af hvad objekter er! Hvordan de oprettes og anvendes! Det er helt klart til nybegyndere, som
Excel-4: Diagrammer og udskrift
Excel-4: Diagrammer og udskrift Udfra indtastede tal og formler kan Excel oprette forskellige typer meget flotte diagrammer: grafer, kurver, søjler og cirkeldiagrammer. OPGAVE: Men der skal være nogle
Talrækker. Aktivitet Emne Klassetrin Side
VisiRegn ideer 3 Talrækker Inge B. Larsen [email protected] INFA juli 2001 Indhold: Aktivitet Emne Klassetrin Side Vejledning til Talrækker 2-4 Elevaktiviteter til Talrækker 3.1 Talrækker (1) M-Æ 5-9 3.2 Hanoi-spillet
Indholdsfortegnelse. 1. Installation af LØN... 1. 2. Introduktion til LØN... 2. 3. Indtastning af lønseddel... 7. 4. Udskrifter...
Løn til Windows Indholdsfortegnelse 1. Installation af LØN... 1 2. Introduktion til LØN... 2 2.1. Første start af LØN...2 2.1.1. Ét eller flere distrikter...2 2.1.2. Lønperioder...3 2.1.3. Kartoteker...4
Søren Christiansen 22.12.09
1 2 Dette kompendie omhandler simpel brug af Excel til brug for simpel beregning, såsom mængde og pris beregning sammentælling mellem flere ark. Excel tilhører gruppen af programmer som samlet kaldes Microsoft
1-1 Usability evaluering af den simple udgave
BILAG 1 s. 2 af 19 Bilag 1 1-1 Usability evaluering af den simple udgave...5 1-2 Heuristisk inspektion af den simple udgave...6 1-3 Usability evaluering af den avancerede udgave...8 1-4 Heuristisk inspektion
Indholdsfortegnelse. javabog.dk Forord
javabog.dk Forord javabog.dk Forord Indholdsfortegnelse 0 Forord...1 0.1 Bogens opbygning...1 0.1.1 Veje gennem bogen...1 0.1.2 Kapitlernes opbygning...3 0.2 Til underviseren...3 0.3 Ændringer i tredje
Egenskaber ved Krydsproduktet
Egenskaber ved Krydsproduktet Frank Nasser 12. april 2011 c 2008-2011. Dette dokument må kun anvendes til undervisning i klasser som abonnerer på MatBog.dk. Se yderligere betingelser for brug her. Bemærk:
Brug af Archive-funktion i SportIdent (baseret på version 10.3 af SI-programmerne)
Brug af Archive-funktion i SportIdent (baseret på version 10.3 af SI-programmerne) Formål: Ved at anvende arkiv-funktionen kan arrangørerne ved et træningsløb uden tilmeldinger eller ved åbne baner hurtigt
Sitecore - basisvejledning Version 2. September 2010
Sitecore - basisvejledning Version. September 00 Sådan opretter du en ny artikelside... Sådan omdøber du et artikelnavn så du får vist æ,ø og å... Sådan udgiver (publiserer) du nyt eller redigeret indhold...4
Endomondo - Vejledning - IOS Kalundborg - Guldborgsund Bibliotekerne
Forklaring Endomondo - Vejledning - IOS Kalundborg - Guldborgsund Bibliotekerne Navigation/tast Hent app'en: Gå i App Store og skriv "Endomondo" og tryk på søg. Find ikonet og tryk på "hent" Tryk på "installer"
Brug Photo Story 3 en let introduktion
Brug Photo Story 3 en let introduktion Denne vejledning forudsætter at programmet Photo Story 3 er installeret på din computer. Se andetsteds for vejledning i at installere programmet, der kan findes gratis
Modul 1 Skolens netværk, skema og kommunikation i Lectio Efter gennemgangen af dette modul skal du:
Modul 1 Skolens netværk, skema og kommunikation i Lectio Efter gennemgangen af dette modul skal du: 1. Kende til skolens netværk og drev. Specielt dit personlige H-drev 2. Kunne se dit skema og dine lektier
3.0 Velkommen til manualen for kanalen Shift 1. 3.1 Introduktion til kanalen 1. 3.2.1 Hvad er et spot? 2. 3.2.2 Opret et nyt spot 2
3.0 Velkommen til manualen for kanalen Shift 1 3.1 Introduktion til kanalen 1 3.2 Shift kanalside 1 3.2.1 Hvad er et spot? 2 3.2.2 Opret et nyt spot 2 3.2.3 Aktivt og inaktivt spot 3 3.2.4 Rediger et spot
Manual for installation og brug af Ad-aware version 2007
Manual for installation og brug af Ad-aware version 2007 af Anette Behrendt Copyright 2007 og alle rettigheder forbeholdt. NB. Du kan aktivere links, ved at klikke på den tynde streg, så bliver du ført
Manual og Hjælp Skoletasken 2
Manual og Hjælp Skoletasken 2 I Skoletasken 2 - Hjælp Indhold I Introduktion 1 Velkomst 2... 2 2 Systemkrav... 2 3 Installation... 3 4 Skoletasken... 8 II Opsætning 10 1 Systemopsætning... 10 2 Bogopsætning...
Brugermanual. Tripple Track Fleet
Brugermanual Tripple Track Fleet Version 3.15 Side 1 af 19 Indholdsfortegnelse Installation:... 3 Login:... 3 Se alle biler:... 4 Status skift:... 5 Historie:... 7 Punkt information:... 9 Find adresse:...
Vejledning. Vejledning til Trio Opgørelse af lærer
til Trio Opgørelse af lærer Hvornår skal en lærer opgøres? Du kan have brug for at skulle opgøre en lærer, hvis vedkommende: stopper går på barsel uden løn fra skolen ændrer beskæftigelsesgrad. Skal en
Manual for Jobmultimeter Bruger
Manual for Jobmultimeter Bruger 23. september 2013 Side 1 af 29 Indhold Generelt... 3 Sådan kommer du i gang... 3 Sådan logger du ind... 3 Mine data... 5 Mine data... 5 Sådan vedligeholder du informationer...
Opstartsvejledning til ipad. Tinderhøj Skole
Opstartsvejledning til ipad Tinderhøj Skole Den første skærm når du starter din ipad Sæt fingeren på pilen og træk den til højre. Vælg sprog En ipad kommer med mulighed for at vælge mange forskellige sprog.
Navision Stat 7.0. Kvikguide om tilpasning af rollecenteret. Overblik. Side 1 af 29. ØSY/STO 18. maj 2015
Side 1 af 29 Navision Stat 7.0 ØSY/STO 18. maj 2015 Kvikguide om tilpasning af rollecenteret Overblik Formål Denne kvikguide omhandler de tilpasninger som du kan foretage i Handlingsbåndet, Navigationsmenuen
Google Chrome side 1 af13
Google Chrome side 1 af13 Indholdsfortegnelse: Download Google Chrome... Side 2 Overblik... Side 3 Angiv startside... Side 7 Søg direkte i adresselinjen... Side 8 Bogmærker sider... Side 8 Bogmærkeadministratoren...
Anvendelse af metoder - Programmering
Denne guide er oprindeligt udgivet på Eksperten.dk Anvendelse af metoder - Programmering En forhåbentlig rigtig god forklaring på hvad metoder er og hvordan de anvendes. Lidt om private og public, retur
Installation af ETF s cloudløsning for Privatpraktiserende ergoterapeuter
Installation af ETF s cloudløsning for Privatpraktiserende ergoterapeuter For at starte opsætningen af produktet, downloades programmet ved at gå til nedstående link, og vælge under Privat praktiserende
Introduktion. Unifaun Online 29-04-2014
Introduktion Unifaun Online 29-04-2014 2 Indhold 1 Introduktion til Unifaun Online... 3 1.1 Grundlæggende navigering... 3 1.2 Søgning af information... 3 1.3 Indtastning af faste oplysninger... 4 1.4 Din
Indholdsfortegnelse. Indholdsfortegnelse.. side 2. Adgang til webgraf 3. Opslag adresse... 4. Styring af layout.. 5. Zoom funktioner..
Indholdsfortegnelse Indholdsfortegnelse.. side 2 Adgang til webgraf 3 Opslag adresse... 4 Styring af layout.. 5 Zoom funktioner.. 6 Panorere på skærmen. 7 Information om grafikken.... 8-10 Print et udsnit.....
Hvis du altid vil starte med fuldskærm, klik på start.htm i stedet for index.htm
BETJENINGSVEJLEDNING Når du er på start siden (index.htm), vælg altid fuld skærm. Herved får du bedre plads til at se på tegningerne. Du kan også klikke på F11 på tastaturet. Hvis du altid vil starte med
Sådan får du Salmebogen på CD-ROM til at fungere i Internet Explorer 7 både under Windows XP og Windows Vista
Sådan får du Salmebogen på CD-ROM til at fungere i Internet Explorer 7 både under Windows XP og Windows Vista Beskrivelse af fejlen Salmebogen på CD-ROM har visse problemer med at fungere i Internet Explorer
Versionsbrev LUDUS Web version 2.10.0. LUDUS Web 2.10.0. Den 2. oktober 2009. J. nr: 4004-V1288-09
Versionsbrev LUDUS Web version 2.10.0 J. nr: 4004-V1288-09 Journal nr.. 4004-V1288-09 LUDUS Web version 2.10.0 Side 1 af 12 1. Leverancens omfang... 3 2. Fremgangsmåde... 4 2.1 Opdatering... 4 2.2 Nyinstallation...
Vejledning. TEA Grønland. Prøveafvikling Trin for trin. skoleåret 2013/14
Vejledning TEA Grønland Prøveafvikling Trin for trin skoleåret 2013/14 1 Indhold Opret prøverne... 3 Afstemning af tilmeldinger til prøver... 3 Indberet detaljer på prøverne... 3 Indberetning af tekstopgivelser...
