JAVA: een platformonafhankelijke taal Voordelen: Eén keer het programma schrijven Eén keer het programma compileren Het programma op om het even welke computer uitvoeren Hoe ? Hello.java Compiler Hello.class (byte code) Interpreter Interpreter Interpreter Windows Linux MacOs Het Java platform Hello.class Java Platform= Java API + Java Virtual Machine Operating System + Hardware De Java API Basiscomponenten: numbers, strings, dates, files, threads,… AWT-Swing JDBC Networking RMI Servlets – JSP XML … De java software (1.4.0) Ontwikkelaar Java 2 Standaard Edition SDK Compiler API JVM Gebruiker Java 2 Standaard Edition JRE API JVM Java 2 Standaard Edition Docs (apart downloaden) www.java.sun.com Een programma schrijven Teksteditor NotePad TextPad … www.textpad.com Ontwikkelomgeving Forte (www.java.sun.com) Jbuilder (www.borland.com) VisualAge for Age (www.ibm.com) Eerste programma public class Hello { public static void main(String[] args) { /* dit is mijn eerste programma */ System.out.println("Goeiemorgen,"); // tekst tonen System.out.println("Goeiemorgen"); } } Primitieve datatypes Gehele getallen Getallen met decimalen byte: -128 … 127 short: -32.768 … 32.767 int: –2.147.483.648 … 2.147.483.647 long: -9.223.372.036.854.775.808 … 9.223.372.036.854.775.807 float: 2-128 … 2127 precies tot 6 à 7 decimalen double: 2-1024 … 21023 precies tot 15 à 16 decimalen Andere types char: één teken in Unicode standaard (2 bytes) boolean: true of false De naam van een variabele moet met een letter beginnen mag geen gereserveerd woord uit Java zijn iedere variabele binnen een bepaald bereik moet een unieke naam hebben afspraak in de java wereld: naam van een variabele begint met een kleine letter ieder woord na het eerste woord begint met een hoofdletter (bv. aantalSuksPerDoos) Lokale variabelen public class Hello { public static void main(String[] args) { int aantalKinderen; char geslacht; double wedde,weddeVanMijnVrouw; boolean autoVerzekeringBetaald; } } // merk op: lokale variabelen hebben geen beginwaarde // de initialisatie kan echter bij de declaratie gebeuren Constante waarden 'M' "Hallo" 1 1L 2478.79 2478.79F het karakter M de string Hallo de integer waarde 1 de long waarde 1 de double waarde 2478.79 de float waarde 2478.79 Constanten in een programma public class Hello { public static void main(String[] args) { final double EUROKOERS=40.3399; //zie const in C++ final double CMINCH; double aantal=10.0; CMINCH=2.54; aantalcm=aantal; double aantalinch=aantalcm/CMINCH; System.out.println(aantalinch); } } Typeconversie:van klein naar groot public class Hello { public static void main(String[] args) { long grootGetal,grootstGetal; int kleinGetal,kleinstgetal; kleinGetal=5; grootGetal=kleinGetal; grootstGetal=10L; kleinstGetal=(int)grootstGetal; } } Rekenkundige bewerkingen Bewerking + * / % Betekenis optellen aftrekken vermenigvuldigen delen restbepaling (kan ook op double) Rekenkundige bewerkingen public class Hello { public static void main(String[] args) { final double CMINCH; int aantalInch=10; double aantalCm; CMINCH=2.54; aantalCm=CMINCH*aantalInch;/* automatische typeconversie */ System.out.println(aantalCm); } } Verkorte bewerkingen Bewerking var+=waarde var-=waarde var*=waarde var/=waarde var%=waarde Betekenis var=var+waarde var=var-waarde var=var*waarde var=var/waarde var=var%waarde Voorbeeld:++ public class Hello { public static void main(String[] args) { int kinderen=0; System.out.println(kinderen++); System.out.println(kinderen); System.out.println(++kinderen); } } Resultaat: 0 1 2 Vergelijkingsbewerkingen Bewerking Betekenis == != > < >= Gelijk aan Verschillend van Groter dan Kleiner dan Groter dan of gelijk aan Kleiner dan of gelijk aan <= Logische bewerkingen Bewerking && || ! Betekenis en (and) of (or) niet (not) if(1) if (voorwaarde) { … // opdrachten die worden uitgevoerd als // voorwaarde==true } if (voorwaarde) { … } else { … // opdrachten die worden uitgevoerd als // voorwaarde==false } if(2) public class Hello { public static void main(String[] args) { double temperatuur=5.0; if (temperatuur<=0.0) { System.out.println("Het vriest"); } else { System.out.println("Het vriest niet"); } } } De ? operator voorwaarde ? resultaatAlsTrue:resultaatAlsFalse public class Hello { public static void main(String[] args) { double temperatuur=5.0; System.out.println(temperatuur <=0.0?"Het vriest":"Het vriest niet"); } } switch(1) switch (integerwaarde) { … case mogelijkheid n: … break; … default: … } switch(2) Oefening Schrijf een programma dat gebruik maakt van switch en aan de hand van een integer de naam van een dag in de week (maandag, dinsdag of woensdag) toont, of de tekst weekend voor een zaterdag of zondag. In andere gevallen moet de tekst andere dag worden getoond. Test uw programma while public class Hello { public static void main(String[] args) { int teller=1; while (teller<=5) System.out.println(teller++); } } do … while public class Hello { public static void main(String[] args) { int teller=1; do System.out.println(teller++); while (teller<=5); } } for public class Hello { public static void main(String[] args) { for(int teller=1;teller<=5;teller++) System.out.println(teller); } } Referentie variabelen Het type String Is een class, geen primitief type !!! Een String variabele is een reference naar een String object Voorbeeld TheVoice : merk op dat de String zanger immutable is Met StringBuffer kan je het object wel wijzigen Merk tevens de + operatie op Een programma met String en+ public class TheVoice { public static void main(String[] args) { String voornaam="Eddy"; String familienaam="Wallyvis"; String zanger=voornaam+' '+familienaam; int rangnr=1; zanger=zanger+' '+rangnr; System.out.println(zanger); }} De Tekens in een String public class TheVoice2 { public static void main(String[] args) { String zanger="Eddy Wallyvis"; for (int teller=0;teller<zanger.length();teller++) System.out.println(zanger.charAt(teller)); } } String variabelen en == public class Horses { public static void main(String[] args) { String horse="Wilkena Z"; String zh="Wilkena"; zh+=" Z"; String mamaCesar=horse; System.out.println(horse==zh); System.out.println(horse==mamaCesar); } } String objecten zijn immutable public class TheVoice3 { public static void main(String[] args) { String bv="Eddy Wallyvis"; bv="Wendy weet van Wanten"; bv=bv.toUpperCase(); System.out.println(bv.toLowerCase()); } } Methodes van String public class Horses2 { public static void main(String[] args) { String horse="Karim des Charpres"; System.out.println(horse.substring(6)); System.out.println(horse.substring(6,8)); System.out.println(horse.lastIndexOf(‘r’)); System.out.println(horse.indexOf("r")); System.out.println(horse.startsWith("Ka")); System.out.println(horse.indexOf(‘C’)); System.out.println(horse.endsWith("res")); System.out.println(horse.toUpperCase()); System.out.println(horse.toLowerCase()); System.out.println(horse.replace(‘ ‘,’_’)); } } Conversie tussen Strings en primitieve varaiabelen Van primitieve variabelen naar Strings: double temperatuur=5.0; String tekst=String.valueOf(getal); Van Strings naar primitieve variabelen String tekst="5.0"; double temperatatuur=Double.parseDouble(tekst); String tekst="7"; int getal=Integer.parseInt(tekst); Lezen van toetsenbord import java.io.*; public class LeesToetsenbord { public static void main(String[] args) throws IOException { BufferedReader toetsenbord = new BufferedReader( new InputStreamReader(System.in)); System.out.println("Geef uw naam"); String naam; naam = toetsenbord.readLine(); System.out.println("U bent "+naam); System.out.println("Aantal kinderen:"); String skinderen; skinderen=toetsenbord.readLine(); int kinderen=Integer.parseInt(skinderen); System.out.println("kindergeld :"+kinderen*4000);} } StringBuffer StringBuffer objecten zijn mutable public class StrBr { public static void main(String[] args) { StringBuffer leeg=new StringBuffer(); System.out.println(leeg.length()+":"+leeg.capacity()); // default=16 StringBuffer horse=new StringBuffer("Karim"); System.out.println(horse.length()+":"+horse.capacity()); naam.insert(6," des Charpres"); naam.append(", klasse Midden"); naan.delete(6,19); //van 6 tot 18 System.out.println(naam); } } StringBuffer Tekens kunnen gelezen en gewijzigd worden: Lezen: charAt(positie); Schrijven: setCharAt(positie,teken) public class StrbTekens { public static void main(String[] args) { StringBuffer naam=new StringBuffer("germaine_de_coeur_brisee"); for(int teller=0;teller<naam.length();teller++) if (naam.charAt(teller)==‘_’) naam.setCharAt(teller,’ ‘); System.out.println(naam); } } Arrays Een variabele declareren die naar een array kan verwijzen: double kwartaalVerkoop[]; //leeg Een array maken en er met een variabele naar verwijzen: kwartaalVerkoop=new double[4]; 4 mag ook een var. zijn Kombinatie van de twee acties: double kwartaalVerkoop=new double[4]; Twee vormen van declaraties: double kwartaalVerkoop[], totaleVerkoop; //1 array double[] kwartaalVerkoop, totaleVerkoop; //2 array’s Aantal elementen van een array public class AantalEl { public static void main(String[] args) { double kwartaalVerkoop[]=new double[4]; System.out.println(kwartaalVerkoop.length); } }// length is hier per uitz. geen method, maar een property Array initializer public class ArrInit { public static void main(String[] args) {int dagenPerMaand[]={31,28,31,30,31,30,31,31,30,31,30,31};} } 31 28 31 30 31 30 31 31 30 31 30 31 0 1 2 3 4 5 6 7 8 9 10 11 Array elementen Wat is het resultaat van volgend programma? public class ArrEl { public static void main(String[] args) { double kwartaalVerkoop[]=new double[4]; for (int tel=0;tel<kwartaalVerkoop.length;tel++) System.out.println(kwartaalVerkoop[tel]); } } 2D-arrays Wat is het resultaat van volgend programma? public class TweedArr { public static void main(String[] args) { char vierOp1Rij[][]=new char[6][7]; for (int rij=0;rij<vierOP1Rij.length;rij++) for(int kolom=0;kolom<vierOp1Rij[0].length;kolom++) vierOp1Rij[rij][kolom]=‘ ‘; } } Objecten, classes Een object stelt een echt-wereld object voor (bankrekening, televisie, klant) Object heeft eigenschappen (properties) en handelingen (methods) Class is prototype van soortgelijke objecten Class beschrijft properties en methods van soortgelijke objecten De naam van een class moet met een letter beginnen Mag geen gereserveerd woord uit Java zijn Iedere class binnen een bepaald bereik moet een unieke naam hebben Afspraak: Naam van een class begint met een hoofdletter Ieder woord na het eerste woord begint met een hoofdletter Voorbeeldklasse Class Rekening: Properties:rekeningNR,saldo,houder Methods:storten,afhalen Subclasses ZichtRekening • Properties:maxKrediet • Methods:afhalen,overschrijven SpaarRekening • Properties:aangroeiIntrest • Methods:afhalen,overschrijven HuwelijksRekening • Methods:storten (met maximum) (overriding) Java kent alleen single inheritance(= een klasse kan maar een base klasse hebben, geen multiple inheritance zoals C++, alhoewel … Een base en afgeleide klassen Eén publieke class per source file public class Rekening {…} public class ZichtRekening extends Rekening {…} public class SpaarRekening extends Rekening {…} public class HuwelijksRekening extends Rekening {…} Objecten en object variabelen Voorbeeld public class Bankprog { public static void main(String[] args) { Rekening mijnRekening=new Rekening(); Rekening onzeRekeningen[]=new Rekening[10]; for(int tel=0;tel<onzeRekeningen.length,tel++) onzeRekeningen[tel]=new Rekening();} } Object variabelen en null public class BankProg { public static void main(String[] args) { Rekening mijnRekening=null; if (mijnRekening==null) System.out.println("niet verbonden"); else System.out.println("verbonden"); mijnRekening=new Rekening(); if (mijnRekening==null) //starten garbage collection System.out.println("niet verbonden"); else System.out.println("verbonden"); } } Property-waarden bijhouden Per property een variabele in de class declareren Ieder object van de class krijgt zijn eigen variabelen De variabelen private declareren (encapsulation) Class code kan ze wijzigen Buitenwereld kan ze niet wijzigen Variabelen van een class krijgen een beginwaarde Type variabele Beginwaarde Byte,short,int,long 0 Float,double 0.0 Char Teken met unicode 0 Boolean False Reference Null Property-waarden invullen en ophalen setXxx() routine in de class Om de private variabele in te vullen door de buitenwereld De routine public declareren zodat de buitenwereld de routine kan aanspreken Parameter van setXxx() routine is invulwaarde property Routine kontroleert parameter op geldige waarde getXxx() routine in de class Zodat de buitenwereld de routine kan aanspreken De routine public declareren zodat de buitenwereld de routine kan aanspreken Resultaat van getXxx() routine is de waarde property Property-waarden invullen en ophalen Public class BankProg { public static void main(String[] args) { Rekening groteRekening=new Rekening(); Rekening kleineRekening=new Rekening(); groteRekening.setSaldo(100000.0); kleineRekening.setSaldo(500.0); System.out.println(groteRekening.getSaldo()); System.out.println(kleineRekening.getSaldo()); } } De property saldo public class Rekening { private double saldo; … public void setSaldo(double saldo) { this.saldo=saldo; } public double getSaldo() { return saldo; } } Property-waarde invullen en ophalen Oefeningen Methods in een class public class Rekening { public void storten(double bedrag) { if (bedrag<0.0) throw new IllegalArgumentException("Bedrag negatief") saldo+=bedrag; } } public class BankProg { public static void main(String[] args) { Rekening kleineRekening=new Rekening(); kleineRekening.setSaldo(500.0); kleineRekening.storten(20.0); } Overloaded methods Een method mag meerdere keren in een class voorkomen als Het aantal parameters verschillend is Het type van de parameters verschillend is public class Rekening { public void storten(final double bedrag) { saldo+=bedrag; } public void storten(final double bedragNietEuro, final double koers) { storten(bedragNietEuro * koers); } } Overloaded methods gebruiken public class BankProg { public static void main(String[] args) { Rekening groteRekening=new Rekening(); groteRekening.setSaldo(500.0); groteRekening.storten(20.0); System.out.println(groteRekening.getSaldo()); groteRekening.storten(10.0,2.0); System.out.println(groteRekening.getSaldo()); } } Resultaat: 520.0 540.0 Constructor Doel: object initialitiseren (In VB: Initialize) Method met zelfde naam als class public Rekening(…) {…} in class Rekening Mag geen returnwaarde hebben (zelfs geen void) Wordt automatisch opgeroepen bij aanmaak nieuw object (new) Rekening groteRekening; groteRekening=new Rekening(…) Mag overloaded worden Constructor-voorbeeld public class Rekening { … public Rekening(final long rekeningNr, String houder, final double saldo) { setRekeningNr(rekeningNr); setHouder(houder); setSaldo(saldo); } … } Constructor-gebruik public class Bankprog { public static void main(String[] args) { Rekening groteRekening=new Rekening(11223344556L, "PDM", 500.0); // Resultaat ophalen via getRekeningNr() enz… } } Overloaded constructor public class Rekening { … public Rekening(final long rekeningNr, String houder, final double saldo) { setRekeningNr(rekeningNr); setHouder(houder); setSaldo(saldo); } public Rekening(final long rekeningNr,final String houder) { this(rekeningNr,houder,0.0); // constructor chaining via this // this moet de eerste opdracht van een method zijn } } Overloaded constructor-gebruik public class Bankprog { public static void main(String args[]) { Rekening groteRekening= new Rekening(11223344556L,"Eddy Walvis", 500.0); Rekening kleineRekening= new Rekening(11223344556L,"La Eksterellala"); System.out.println(kleineRekening.getRekeningNr()); System.out.println(kleineRekening.getHouder()); System.out.println(kleineRekening.getSaldo()); } } Resultaat: 11223344556 La Eksterellala 0.0 Default constructor Constructor zonder parameters Gemaakt door de compiler als U geen andere constructors maakt Niet gemaakt door de compiler als u wel andere constructors maakt public class Bankprog { public static void main(String args[]) { Rekening groteRekening= new Rekening(); } } //let op dit geeft een foutmelding !!!Daarom … Eigen default constructor public class Rekening { … public Rekening(); { setHouder("Onbekend"); } … } Class ZichtRekening Erft van Rekening Extra properties: maxkrediet Gewijzigde method: setSaldo Extra methods: afhalen, overschrijven public class ZichtRekening extends Rekening { } Constructors en inheritance De class ZichtRekening heeft geen constructor dus Java maakt een default constructor Deze default constructor roept automatisch de constructor van de base class op Als de base class geen default constructor heeft, krijgt U een compiler fout: cannot resolve symbol symbol: constructor Rekening() De constructors worden geerfd ZichtRekening groteRekening= new ZichtRekening(11223344556L,"Wallyvis",500.0); cannot resolve symbol symbol: constructor ZichtRekening (int,java.lang.String,double) De property maxKrediet public class ZichtRekening extends Rekening { private double maxKrediet; public void setMaxKrediet(double maxKrediet) { if (maxKrediet>0.0) throw new IllegalArgumentException("maxKrediet positief"); this.maxKrediet=maxKrediet; } public double getMaxKrediet() { return maxKrediet; } } Constructors in de derived class public class ZichtRekening extends Rekening { … public ZichtRekening(long rekeningNr,String houder,double saldo,double maxKrediet) { super(rekeningNr,houder,saldo); // constructor base class oproepen setMaxKrediet(maxKrediet); } public ZichtRekening(long rekeningNr,String houder,double saldo) { this(rekeningNr,houder,saldo,0.0); // constructor eigen class oproepen } public ZichtRekening(long rekeningNr,String houder) { this(rekeningNr,houder,0.0); // constructor eigen class oproepen } } Gebruik van deze constructors public class BankProg { public static void main(String[] args) { ZichtRekening rekening1=new ZichtRekening(11223344556L,"Eddy Wallyvis",500.0,100.0); ZichtRekening rekening2=new ZichtRekening(11223344556L,"La Eksterellala",500.0); ZichtRekening rekening3=new ZichtRekening(11223344556L,"M. de C. Brisée"); } } Method overriding Een method uit de base class die U ook in de derived class uitwerkt Als U de method uitvoert op een object van de derived class, voert java de versie van de derived class uit: "eigen methode eerst" Method overriding-voorbeeld public class ZichtRekening extends Rekening { … public void setSaldo(double saldo) { if (saldo < maxKrediet) throw new IllegalArgumentException("saldo < maxkrediet"); super.setSaldo(saldo); //method uitvoeren van Rekening } } Method overriding- toepassing public class BankProg { public static void main(String[] args) { Rekening groteRekening=new Rekening(11223344556L,"Eddy Wallyvis"); ZichtRekening kleineRekening=new ZichtRekening(11223344556L,"La Eksterellala"); groteRekening.setSaldo(-500.0); kleineRekening.setSaldo(-500.0); } } Exception in thread "main" Java.lang.IllegalArgumentException: saldo < maxKrediet at ZichtRekening.setSaldo(ZichtRekening.java:31) at BankProg.main(BankProg.java:10) Base class reference variabele verbinden met derived object public class BankProg { public static void main(String[] args) { Rekening eenRekening=new ZichtRekening(11223344556L,"Eddy Wallyvis"); eenRekening.setMaxKrediet(-100.0); //is geen method van class // Rekening (class van de reference variabele!!! } } cannot resolve symbol symbol: method setMaxKrediet (double) location: class Rekening eenRekening.setMaxKrediet(-100.0); Base class reference variabele verbinden met derived object Tweede poging public class BankProg { public static void main(String[] args) { Rekening eenRekening=new ZichtRekening(11223344556L,"Eddy Wallyvis"); eenRekening.setSaldo(100.0); } } Derived class reference variabele verbinden met base class object public class BankProg { public static void main(String[] args) { ZichtRekening eenRekening=new ZichtRekening(11223344556L,"Eddy Wallyvis",0.0,-5.0); Rekening tussenRekening=eenRekening; eenRekening=(ZichtRekening) tussenRekening; System.out.println(eenRekening.getMaxKrediet()); } } Resultaat: -5.0 Method afhalen public class ZichtRekening extends Rekening { … public void afhalen(final double bedrag) { if (bedrag < 0.0) throw new IllegalArgumentException("bedrag negatief"); setSaldo(getSaldo() – bedrag); } } Opmerking: saldo is private in base class, ook niet bereikbaar in derived class, maar getSaldo() is public Method afhalen-toepassing public class Bankprog { public static void main(String[] args) { Zichtrekening eenRekening=new ZichtRekening(11223344556L,"Eddy Wallyvis",10.0,-5.0); eenRekening.afhalen(1.0); System.out.println(eenRekening.getSaldo()); } } Resultaat: 9.0 Instanceof public class ZichtRekening extends Rekening { … public void overschrijven(final Rekening naarRekening, final double bedrag) { if (! (naarRekening instanceof Rekening)) throw new IllegalArgumentException(" naarRekening geen Rekening"); setSaldo(getSaldo() – bedrag); naarRekening.storten(bedrag); } } Instanceof-gebruik public class BankProg { public static void main(String[] args) { ZichtRekening rekening1=new ZichtRekening(11223344556L,"Eddy Wallyvis",10.0); ZichtRekening rekening2=new ZichtRekening(65544332211L,"Aspergio",20.0); rekening1.overschrijven(rekening2,1.0); System.out.println(rekening1.getSaldo()); System.out.println(rekening2.getSaldo()); } } Resultaat: 9.0 21.0 Instanceof-gebruik public class BankProg { public static void main(String[] args) { ZichtRekening rekening1=new ZichtRekening(11223344556L,"Eddy Wallyvis",10.0); Rekening rekening2=new Rekening(65544332211L,"Aspergio",20.0); rekening1.overschrijven(rekening2,1.0); System.out.println(rekening1.getSaldo()); System.out.println(rekening2.getSaldo()); } } Resultaat: 9.0 21.0 Instanceof-gebruik public class BankProg { public static void main(String[] args) { ZichtRekening rekening1=new ZichtRekening(11223344556L,"Eddy Wallyvis",10.0); rekening1.overschrijven(null,1.0); System.out.println(rekening1.getSaldo()); System.out.println(rekening2.getSaldo()); } } Exception in thread "main" java.lang.IllegalArgumentException: naarRekening geen Rekening at ZichtRekening.overschrijven(ZichtRekening.java:43) at BankProg.main(BankProg.java:9) Class SpaarRekening Extra properties: aangroeiIntrest Gewijzigde method: setSaldo Static variabelen van een class bestaan maar één keer voor alle objecten van die class (de objecten delen de static variabele) Static methods kunnen enkel static variabelen gebruiken U kan static methods uitvoeren op objecten van de class de class zelf Static variabelen en methods public class SpaarRekening extends Rekening { private static double aangroeiIntrest; public static void setAangroeiIntrest(final double aangroeiIntrest) { if (aangroeiIntrest < 0.0 ) throw new IllegalArgumentException("intrest negatief"); SpaarRekening.aangroeIntrest=aangroeIntrest; } public static double getAangroeIntrest() { return aangroeiIntrest; } } Static variabelen en methods public class BankProg { public static void main(String[] args) { SpaarRekening.setAangroeiIntrest(2.0); //op alle objecten!!! SpaarRekening eenRekening; eenRekening=new SpaarRekening(); SpaarRekening tweedeRekening; tweedeRekening=new SpaarRekening(); eenRekening.setAangroeiIntrest(3.0); //nieuw voor alle objecten System.out.println(SpaarRekening.getAangroeiIntrest()); System.out.println(eenRekening.getAangroeiIntrest()); } } Protected variabelen en methods Protected: bereikbaar door methods van de class zelf en derived classes, niet door de buitenwereld public class SpaarRekening extends Rekening { … public void setSaldo(double saldo) { if (saldo < 0.0) throw IllegalArgumentException("saldo negatief"); this.saldo=saldo; // verwijzing naar de protected variabele uit //Rekening } } Class HuwelijksRekening Gewijzigde methods: setSaldo storten (met maximum) public class HuwelijksRekening extends Rekening { … public void setSaldo(double saldo) { if (saldo < 0.0) throw IllegalArgumentException("saldo negatief"); this.saldo=saldo; // verwijzing naar de protected variabele uit //Rekening } } Class HuwelijksRekening - storten public class HuwelijksRekening extends Rekening { … public final double MAXSTORTING=1000.0; public void storten(final double bedrag) { if (bedrag > MAXSTORTING) throw IllegalArgumentException("bedrag te groot"); super.storten(bedrag); } } Abstract class Een class waarvan U geen object kan maken Deze class dient enkel als base class voor andere classes U kan wel variabelen declareren die als type een abstract class hebben U kan met zo’n variabele naar een object van een derived class verwijzen public abstract class Rekening { … } Abstract class (vervolg) public class BankProg { public static void main(String[] args) { Rekening slechteRekening=new Rekening(); } Resultaat: Rekening is abstract; cannot be instantiated Abstract class (vervolg) public class BankProg { public static void main(String [] args) { Rekening rekeningen[]=new Rekening[2]; rekeningen[0]=new SpaarRekening(); rekeningen[1]=new HuwelijksRekening(); for(int teller=0;teller < rekeningen.length;teller++) { rekeningen[teller].storten(100.0); System.out.println(rekeningen[teller].getSaldo()); } } } Abstract method Een method die in de base class geen code bevat Derived classes moeten de method overridden en code geven Een class met een abstract method moet een abstract class zijn Abstract method (vervolg) public abstract class Rekening { … public abstract String soortRekening(); } public class ZichtRekening(); { … public String soortRekening(); {return "ZichtRekening";} } Analoog voor HuwelijksRekening en SpaarRekening (Polymorfisme) Abstract method (vervolg) public class BankProg { public static void main(String [] args) { Rekening rekeningen[]=new Rekening[2]; rekeningen[0]=new SpaarRekening(); rekeningen[1]=new HuwelijksRekening(); for(int teller=0;teller < rekeningen.length;teller++) { rekeningen[teller].storten(100.0); System.out.println(rekeningen[teller].soortRekening()); } } } Final class Een class waarvan geen andere class kan erven Opdat Hackers niet zouden erven van uw class zodat ze methods kunnen overriddden met Hackerscode Omdat uw class af is public final class HuwelijksRekening extends Rekening { … } public class VerlovingsRekening extends HuwelijksRekening {…} Resultaat: cannot inherit from final HuwelijksRekening Final method Een method die een derived class niet kan overridden public class SpaarRekening extends Rekening { … public final void setSaldo(double saldo) { if(saldo<0.0) throw IllegalArgumentException("saldo negatief"); this.saldo=saldo; }} public class SuperSpaarRekening extends SpaarRekening { public void setSaldo(double saldo) { this.saldo=saldo;}} Resultaat: overridden method is final De class object Object Rekening ZichtRekening SpaarRekening HuwelijksRekening Enkele methods van Object String toString() Doel: een String teruggeven die de belangrijkste inhoud van het object bevat boolean equals(Object obj) Doel: het huidig object vergelijken met een ander object Standaardgedrag toString() public class BankProg { public static void main(String[] args) { ZichtRekening rekening1=new ZichtRekening(11223344556L,"Eddy Wallyvis",10.0); ZichtRekening rekening2=new ZichtRekening(65544332211L,"Aspergio",20.0); System.out.println(rekening1.toString()); System.out.println(rekening2.toString()); } Eigen versie toString() public class Rekening { … public String toString() { return soortRekening() + " nr." + rekeningNr; } } Nieuw gedrag toString() public class BankProg { public static void main(String[] args) { ZichtRekening rekening1=new ZichtRekening(11223344556L,"Eddy Wallyvis",10.0); ZichtRekening rekening2=new ZichtRekening(65544332211L,"Aspergio",20.0); System.out.println(rekening1.toString()); System.out.println(rekening2.toString()); System.out.println(rekening1); } Standaardgedrag equals(Object obj) public class BankProg { public static void main(String[] args) { ZichtRekening rekening1=new ZichtRekening(65544332211L,"Eddy Wallyvis",10.0); ZichtRekening rekening2=new ZichtRekening(65544332211L,"Aspergio",20.0); ZichtRekening rekening1bis=rekening1; System.out.println(rekening1.equals(rekening2)); System.out.println(rekening1.equals(rekening1bis)); } Resultaat: false true Schrijf een eigen method equals op basis van rekeningnummer Interfaces Een contract met methods Bevat enkel declaratie van methods Kan ook constanten bevatten Een class kan de interface implementeren om de methods uit te werken Meerdere classes kunnen één interface implementeren Eén class kan meerdere interfaces implementeren Een interface kan erven van een andere interface Multiple inheritance!!! Meerdere classes implemeteren een interface Kost:double bedragKost(),boolean personeelsKost() Vrachtwagen • merk • kostPerkm • aantalkm • bedragKost=kostPerKm * aantalKm • Personeelskost=false FotokopieMachine • • • • • merk kostPerBlz aantalblz bedragkost=kostPerBlz*aantalBlz personeelsKost=false Werknemer • • • • naam wedde bedragKost=wedde personeelsKost=true De interface Kost public interface Kost { double bedragKost(); boolean personeelsKost(); } De class Vrachtwagen public class Vrachtwagen implements Kost { private String merk; private double int aantalKm; private double kostPerKm; public Vrachtwagen(String merk,double kostPerKm,int aantalKm) { this.merk=merk; this.kostPerKm=kostPerKm; this.aantalKm=aantalKm; } public double bedragKost() { return kostPerKm * aantalKm; } public boolean personeelsKost() {return false;} public int getAantalKm() {return aantalKm;} } Interface variabele(1) Een reference variabele met als type een interface Kost eenKost; Kan enkel refereren naar een object van een class die de interface implementeert eenKost=new Werknemer("Eddy",2000.0); Kan op dat object enkel methods uitvoeren die de interface beschrijft System.out.println(eenKost.bedragKost()); System.out.println(eenKost.personeelsKost()); System.out.println(eenKost.getWedde()); // foutief, // filterende werking Interface variabele(2) public class KostProg { public static void main(String[] args) { Kost kosten[]=new Kost[4]; kosten[0]=new Werknemer("Eksterellala",2000.0); kosten[1]=new Werknemer("Aspergio", 1500.0); kosten[2]=new Vrachtwagen("Redford",0.35,25000); kosten[3]=new Fotokopiemachine("Monica",0.02,9000); double mensKosten=0.0, andereKosten=0.0; for (int tel=0;tel<kosten.length;tel++) if (kosten[tel].personeelsKost()) mensKosten+=kosten[tel].bedragKost(); else andereKosten+=kosten[tel].bedragKost();; System.out.println("Mens kosten: " +menskosten); System.out.println("Andere kosten: "+andereKosten); } } Een class implementeert meerdere interfaces Kost: double bedragKost();boolean personeelsKost; Afschrijving: int termijn();double jaarlijksBedrag(); Vrachtwagen • • • • • • • • • merk kostPerKm aantalKm aankoopPrijs voorzieneLevensduur bedragKost=kostPerKm * aantalKm Kost personeelsKost=false Kost termijn=voorzieneLevensduur Afschrijving jaarlijksBedrag=aankoopPrijs/voorzieneLevensduur Afschrijving GUI AWT: abstract windowing toolkit Swing Meer modern Javabeans zijn zelfgemaakte swingcomponenten Structuur van Swing javax.swing Class Jbutton java.lang.Object java.awt.Component (setEnabled, getBounds) java.awt.Container (add(Component),setLayout,invalidate) javax.swing.Jcomponent (setFont,setForeground,setMaximumSize,setMinimumSize) javax.swing.AbstractButton (addActionListener,setEnabled,setIcon,setText) javax.swing.Jbutton (isDefaultButton) Opbouw van de GUI BorderLayout (kent de gebieden NORTH,WEST,SOUTH,EAST,CENTER) GridLayout FlowLayout BoxLayout GridBagBagLayout CardLayout Swing componenten JPanel JScrollPane JSplitPane JTabbedPane JToolBar JComboBox JList JSlider JButton,JCheckBox,JRadioButton JMenuBar,Jmenu,JMenuItem,JCheckBoxMenuItem,JRadio ButtonMenuItem,JPopupMenu Jlist,Jlabel,JProgressBar Tooltips JColorChooser,JFileChooser,JInternalFrame,JDesktopFram e,Jtable,JTextArea,JEditorPane,JTextPane,JTree Events Als er een button wordt ingedrukt spreken we van een Event Het button noemen we het subject Een observer is een class waarbinnen zich een method bevindt die wordt uitgevoerd bij optreden van het event De link tussen een subject en een observer is een interface Als een observer meerdere objecten observeert die dezelfde events opsturen zal de Observer hiervoor "medewerkers" objecten inschakelen Deze medewerkers moeten meestal toegang hebben tot de private data van de observator, hierdoor zullen deze objecten dan objecten zijn van inner classes Events en inner classes public class Programma1 extends javax.swing.Jframe { class ErIsIetsGebeurt implements java.awt.event.ActionListener //inner class die de interface ActionListener implementeert { public void actionPerformed(java.awt.event.ActionEvent e) { javax.swing.JOptionPane.showMessage(null,"er is iets gebeurt"); } } … public Programma1() { … ErIsIetsGebeurt erisIetsGebeurt=new ErIsIetsGebeurt(); // creatie van een object van de // inner class jButton1.addActionListener(erisIetsGebeurt); // registreer het object van de inner class jButton2.addActionListener(erisIetsGebeurt); // als observator, listener bij de 4 buttons of jButton3.addActionListener(erisIetsGebeurt); // subjects jButton4.addActionListener(erisIetsGebeurt); … } Inner classes Kunnen gedefinieerd zijn binnen een andere class, binnen een method van een class of zelfs lokaal blok Inner classes kunnen alleen gebruikt worden in de scoop waarin ze gedefinieerd zijn Inner classes hebben toegang tot de data die toegankelijk is op de plaats waar ze gedefinieerd zijn Inner classes hebben geen referentie zoals super of this naar de outer class Inner classes In de class ErIsIetsGebeurt wordt de method showMessageDialog opgeroepen. Deze aanvaardt als eerste parameter een referentie naar het parent window of Jframe. Dit kan niet in een inner class. Oplossingen: Gebruik null, niet de meest juiste oplossing Geef de inner class een datamember javax.swing.Jframe outer; initialiseer deze in de constructor van ErIsIetsGebeurt(Jframe f) { outer=f;} Creëer het object erisIetsGebeurt als volgt: ErIsIetsGebeurt erisIetsgebeurt=new ErIsIetsGebeurt(this); Roep in de method actionPerformed een private method op van JFrame public void actionPerformed(java.awt.event.ActionEvent e) {klik (e);} waarbij klik een method is van de eigen class die afgeleid is van Jframe private void klik(java.awt.event.ActionEvent e) {javax.swing.JOptionPane.showMessageDialog(this,"er is iets gebeurt");} Anonieme inner classes(1) Het gebeurt zelden dat meerdere buttons dezelfde actie tot gevolg hebben. Dus wordt de referentie erisIetsGebeurt maar op één plaats gebruikt. We kunnen de referentie dan ook weglaten jButton1.addActionListener(new ErIsIetsGebeurt(this)); Maar de class ErIsIetsGebeurt wordt ook maar op één plaats gebruikt. We zouden dan ook de naam kunnen weglaten, dus ook het woord class. Maar dan heeft implements geen zin meer Waar moet die class dan komen? Op de plaats waar het object moet worden gecreëerd Anonieme inner classes(2) jButton1.addActionListener(new ErIsIetsGebeurt(this)); wordt nu: jButton1.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent e) { klik(e); //private method van de ‘outer class’ } } ); Merk op: in de nieuwe constructie is "this" verdwenen op de eerste lijn en wordt in actionPerformed de methode klik() van de outer class opgeroepen. De parameter "this" zou worden doorgegeven aan de constructor, maar wat is de naam van constructor van een anonieme class? Anonieme classes kunnen geen expliciete constructor hebben. Event adapters Sommige interfaces definiëren meerdere methods; terwijl we maar in één method geïnteresseerd zijn moeten we ze allemaal implementeren Hiervoor zijn in Java Adapter classes voorzien, deze bevatten voor elke method in de interface een "dummy" lege implementatie We leiden dan een class af van de Adapter en overridden alleen de method die ons interesseert. Applets Een applet is een java programma dat geladen wordt in de browser vanuit de HTML code Een applet kan een animatie zijn die dienst doet als schermversiering maar het kan een complexe medische toepassing zijn met 3D faciliteiten Applets en beveiliging Applets mogen andere programma’s starten Krijgen geen toegang tot het filesysteem Mogen geen native methods oproepen Mogen geen andere socket openen dan naar de host vanwaar ze geladen zijn System properties worden afgeschermd Windows en dialog gecreëerd door een applet zijn voorzien van een footer met de waarschuwing "Warning applet window" Applets runnen in een beveiligde omgeving, de zandbak genoemd Applet methods init(): de applet initisialiseert zichzelf na het laden door de browser start(): na de initisalisatie of als de gebruiker terug op de pagina komt, of als de applet onzichtbaar wordt paint(): deze method laat de applet toe zichzelf te tekenen op vraag van de browser stop(): wordt uitgevoerd als de gebruiker de pagina verlaat of de applet onzichtbaar wordt destroy(): deze method kuist op voor deze ontladen wordt, bv. Sluiten van files, sockets of database connecties Hallo Aspergio applet(1) import java.awt.*; import java.applet.*; public class HelloTallin extends Applet { public void paint(Graphics g) //g is de grafische omgeving // alle tekenactiviteiten vinden plaats in paint { g.drawString("Goodevening Tallin", 10, 10); } } Hallo Aspergio applet(2) De applet heeft een HTML bestand nodig vanwaaruit het opgeroepen wordt <html> <head><title>Aspergio’s pagina</title><head> <body> <applet code=HelloTallin.class width=100 height=100></applet> </body> </html> Hallo Aspergio browser Plaats de applet class file en de html file in dezelfde directory Zet de instellingen van IE voor het verversen van de inhoud van een pagina op "Bij elk bezoek" Extra->Internet Opties->Instellingen Laadt de html file Nog enkele applet methods getDocumentBase():returnt een URL-object dat de url van de huidige pagina bevat getCodeBase():returnt een url object dat de url vanwaar de applet is geladen bevat getImage(URL base,String target) en getAudioClip(URL base,String target):laden resources, dit kan alleen van de host vanwaar de applet is geladen getAppletContext(), showDocument(URL,target):laadt een html pagina over de huidige pagina, of een bepaald frame. Hiermee kan een applet tot menu omgevormd worden Networking Communicatie gaat van Een toestel, IP nummer Een applicatie, port nummer Naar Een toestel, IP nummer Een applicatie, port nummer Elk port nummer komt overeen met een service Networking, adres info import java.net.*; public class GetInetInfo { public static void main(String[] args) { InetAddress address=null; try { address=InetAddress.getByName("BIB2"); } catch(UnknownHostException e) { e.printStackTrace(); System.exit(1); } System.out.println("Host name:" + address.getHostName()); System.out.println("Host address:" + address.getHostAddress()); System.exit(0); } } Sockets Een client 172.16.20.1 opent een socket met poort 1050 De client doet een een aanvraag om een http verbinding op te zetten met de server 172.16.0.1 op poort 80 Een aanvraag wordt verstuurd van 172.16.20.1:1050 naar 172.16.0.1:80 De server creëert een nieuwe socket om te antwoorden (met bv. Poortnummer 7689) De server en client communiceren via deze sockets De port nummers van waaruit een verbinding wordt opgezet zijn meestal groter dan 1024, omdat deze niet gereserveerd zijn Een lijst met gereserveerde nummers vindt U op: http://www.iana.org/assignments/port-numbers Daytime Server import java.net.*; import java.io.*; import java.util.*; public class DaytimeServer {public static void main(String[] args) {int port=13; ServerSocket myServerSocket=null; try { myServerSocket= new ServerSocket(port);} catch (IOException e) { System.out.println("Fout bij creatie socket:"+e);System.exit(1);} System.out.println("…started"); while (true) { try { Socket mySocket=myServerSocket.accept(); PrintWriter myWriter=new PrintWriter(mySocket.getOutputStream()); Calendar myCalendar=Calendar.getInstance(); Date myDate=myCalendar.getTime(); myWriter.println(myDate.toString());myWriter.flush();mySocket.close(); } catch (IOException e) { System.out.println("fout tijdens run : "+ e); System.exit(1); } }}} Daytime Client import java.io.*;import java.net.*; public class DaytimeClient { public static final int DAYTIMEPORT=13; public static void main(String[] args) { if (args.length != 1) { System.err.println("Gebruik: java DaytimeClient address"); System.exit(1);} InetAddress address=null; try{ address=InetAddress.getByName(args[0]);} catch(UnknownHostException e) {e.printStackTrace();System.exit(2);} Socket sock=null; try{ sock=new Socket(address,DAYTIMEPORT);} catch(IOException e) {e.printStackTrace();System.exit(3);} InputStream in=null; try{ in=sock.getInputStream();} catch(IOException e) {e.printStackTrace();System.exit(5);} BufferedReader reader=new BufferedReader(new InputStreamReader(in)); String line=null; try{line=reader.readLine();} catch(IOException e) {e.printStackTrace();System.exit(6);} System.out.println(line); System.exit(0);}}