Referentie variabelen

advertisement
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);}}
Download