Programmeren in Java/Klassen: verschil tussen versies

Verwijderde inhoud Toegevoegde inhoud
DimiC88 (overleg | bijdragen)
DimiC88 (overleg | bijdragen)
Geen bewerkingssamenvatting
Regel 74:
</syntaxhighlight>
 
De methodes hebben we gedefinieerd met ''public'' gevolgd door ''void''. ''void'' betekent dat onze methode geen waarde zal terug geven wannerwanneer we de methode oproepen. We geven onze methodes hun namen gevolgd door haakjes en accolades. Die accolades bevatten de functionaliteit die de methodes moeten uitvoeren telkens ze worden opgeroepen in dit geval zullen ze "De auto rijdt." of "De auto remt." afprinten. Nu je de methodes hebt gedifinieerd kun je ze gebruiken. Bijvoorbeeld als volgt in de ''main'':
 
<syntaxhighlight lang="java" highlight=5-6>
Regel 141:
 
== Constructors ==
Een constructor wordt aangeroepen op het moment dat er een nieuwe instantie van een klasse wordt gemaakt. Elke keer als het sleutelwoord ''new'' wordt gebruikt betekent dit dat er een constructor wordt aangeroepen. Nu hebben we tot nu toe met onze ''Car'' altijd een instantie kunnen maken met ''new'', hoewel we geen constructor hebben gedefiniëerd. Dit komt omdat als je in Java geen constructor zelf definiëerd Java er voor jou één aanmaakt tijdens het compileren. De constructor die dan wordt aangemaakt ziet er als volgt uit.
 
<syntaxhighlight lang="java" highlight=5-7>
public class Car {
 
public String typeOfFuel = "diesel";
public Car() {
}
 
public void drive() {
System.out.println("De auto rijdt met " + typeOfFuel + ".");
}
 
public void brake() {
System.out.println("De auto remt.");
}
}
</syntaxhighlight>
 
Een constructor kun je aanmaken door ''public'' te vermelden gevolgd door de naam van de klasse. In tegenstelling tot een gewone methode heeft de constructor géén return type, zelfs niet ''void''. Een constructor is bedoeld om dus een instantie van een klasse aan te maken. Binnen de constructor kun je dus code schrijven die moet uitgevoerd worden wanneer je een object aanmaakt. We kunnen bij onze ''Car'' dan bijvoorbeeld het type brandstof bepalen.
<syntaxhighlight lang="java" highlight=3,6>
public class Car {
 
public String typeOfFuel;
public Car() {
typeOfFuel = "diesel";
}
 
public void drive() {
System.out.println("De auto rijdt met " + typeOfFuel + ".");
}
 
public void brake() {
System.out.println("De auto remt.");
}
}
</syntaxhighlight>
Nu heb je wellicht gemerkt dat wat we in bovenstaand voorbeeld hebben gedaan niet veel veranderd. We hebben enkel en alleen de plaatst waar ''typeOfFuell'' wordt bepaald verhuisd van het veld naar de constuctor. Als je nu een nieuw ''Car'' object zou aanmaken zal die nogsteeds diesel als standaard brandstof hebben. De oplossing is argumenten toe te voegen aan de constructor.
<syntaxhighlight lang="java" highlight=5-6>
public class Car {
 
public String typeOfFuel;
public Car(String typeOfFuel) {
this.typeOfFuel = typeOfFuel;
}
 
public void drive() {
System.out.println("De auto rijdt met " + typeOfFuel + ".");
}
 
public void brake() {
System.out.println("De auto remt.");
}
}
</syntaxhighlight>
 
==Structuur==
Regel 218 ⟶ 275:
We wijzigen de waarde van myValue via de kopie van de referentie in doSomething naar waarde 20. (We kunnen dus het object wijzigen). Dan in regel 12 laten we pbv naar een nieuw object
wijzen (toekenning) en wijzigen de waarde van myValue naar 30. De laatste regel (25) in main toont nog steeds de waarde 20 voor myValue. De referentie pbv in main na afloop van doSomething wijst nog steeds naar de oorspronkelijke pbv en niet naar het nieuwe PassByValue object aangemaakt in doSomething op regel 12. Dit laatste zou anders geweest zijn moest Java pass by reference zijn, dan was myValue 30 op regel 25.
 
==final, abstract, static, synchronized, native, strictfp==
Naast de hiervoor genoemde access modifiers zijn er nog andere modifiers die gebruikt kunnen worden voor klassen, velden of methoden.
 
De eerste hiervan is final. final geeft aan dat er geen andere implementatie of waarde van iets mogelijk is.
 
{{Code
| Taal=Java
| Titel=Optellen.java
| Code=
<syntaxhighlight lang="java" line>
final class Optellen {
 
public int telOp(int a, int b) {
return a + b;
}
}
</syntaxhighlight>
}}
 
De final in regel 1 geeft aan dat het niet mogelijk is om de klasse Optellen te gebruiken om van te erven (zie module 6 voor meer informatie over dit onderwerp).
 
{{Code
| Taal=Java
| Titel=AbstractOptellen.java
| Code=
<syntaxhighlight lang="java" line>
abstract class AbstractOptellen {
 
public abstract int telOp(int a, int b);
}
</syntaxhighlight>
}}
 
abstract bij een klasse (zie regel 1 in AbstractOptellen.java) geeft aan de klasse niet geinstantieerd kan worden. Het idee hierachter is dat een abstracte klasse wordt uitgebreid door andere klassen (zie module 6, geavanceerde klassen voor meer informatie).
 
Een methode kan ook abstract zijn. Op regel 3 in AbstractOptellen.java is daar een voorbeeld van te zien. Wat meteen opvalt is dat de methode wel wordt beschreven maar geen code bevat die iets doet. De ; na de argumentenlijst is dan ook het einde van de definitie van een abstracte methode. Deze methode kan worden geimplementeerd door een subklassen van AbstractOptellen.
 
Zodra een klasse een abstract methode bevat '''moet''' de klasse zelf ook abstract zijn. Het omgekeerde is niet noodzakelijk waar.
 
static geeft aan dat iets bij de klasse hoort, en niet bij de instanties van die klasse. In Velden.java is hier een voorbeeld van te vinden: het veld aantal is static, dat wil zeggen dat alle instanties van Velden dit veld met elkaar delen.
 
Een methode kan ook static zijn. Een static methode kan worden aangeroepen zonder dat er een instantie van de klasse is:
 
{{Code
| Taal=Java
| Titel=StaticVoorbeeld.java
| Code=
<syntaxhighlight lang="java" line>
class StaticVoorbeeld {
 
public static int telOp(int a, int b) {
return a + b;
}
}
</syntaxhighlight>
}}
 
Nu de methode telOp static is gemaakt is het mogelijk geworden om deze aan te roepen met StaticVoorbeeld.telOp(1, 2); De naam van de klasse wordt dus gebruikt om aan te geven welke methode moet worden uitgevoerd.
 
synchronized is een andere modifier die voor methodes gebruikt kan worden. synchronzed geeft aan dat maar 1 thread tegelijk de synchronized methode kan aanroepen. Multi-threading is een geavanceerd onderwerp dat we hier niet verder zullen behandelen.
 
Andere modifiers zijn native en strictfp. We vermelden deze alleen voor de volledigheid. native wil zeggen dat de implementatie van de methode in platform-specifieke code is, over het algemeen in C. strictfp wil zeggen dat een klasse of methode alle floating point berekeningen uitvoert volgens de IEEE 754 standaard.
 
 
{{Sub}}
Informatie afkomstig van https://nl.wikibooks.org Wikibooks NL.
Wikibooks NL is onderdeel van de wikimediafoundation.