Archief - Static/Final

Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.

LilWeezy

Legacy Member
Kan iemand volgende termen uitlegge aub ?

Static bij methodes + variabelen

Final bij methodes + variabelen

Want op het internet staat het vol met onduidelijke informatie hiervan.

Toch al bedankt !

Grtz

Jerre Muesli

Legacy Member
final:
op methods: je kunt de method niet overriden
op variabelen: bij primitives kan je de waarden niet veranderen en bij objecten kan je de reference niet veranderen.

static:
op methods: of class methods; de methode is op class niveau en dus moet je geen instantie aanmaken. Meestal gebruikt voor helper methods in utility classes
op variabelen: ook wel class variables genoemd; er is 1 gemeenschappelijke kopie over alle verschillende instanties.

Pudmeister

Legacy Member
Misschien nog extra ter info: een static variabele (klasse variabele) hoort niet bij een object zoals niet-static variabelen, maar het hoort wel bij een klasse.

Bijvoorbeeld je hebt een klasse Auto en je hebt als objectvariabelen String merk en int topsnelheid. Als je dan objecten a1 en a2 van de klasse Auto maakt, kan je de objectvariabelen bereiken door a1.topsnelheid of a2.merk te schrijven. Dit is echter niet mogelijk bij een klassevariabele (static variabele) want die hoort niet bij een object (instantie) maar wel bij de klasse Auto in het algemeen. Stel je maakt de variabele double dieselprijs, dan maak je hier best static double dieselprijs van. Dan wordt die variabele niet opnieuw aangemaakt voor elk Auto-object, dat zou geen nut hebben want de variabele is niet gebonden aan een spicifiek object. Plus zo spaar je geheugen uit.

Final variabelen moet je bij de declaratie initialiseren en kan je naderhand niet meer aanpassen. Daar valt niet meer over te zeggen ;)

Code:
public class Auto{

//declaratie van de variabelen
final static maxbebouwdekom = 90;
final static maxautostrade = 120;
//Deze variabelen zijn final dus niet meer te wijzigen, en zijn static dus ze horen bij de klasse en niet bij elk Auto object

static double dieselprijs = 1.55;
//static want ze hoort bij de klasse, niet final want ze kan variëren

String merk;
double topsnelheid;
double verbruikliterper100km;
//Dit zijn variabelen die bij elk object verschillend zijn dus ze zijn niet static (dit noemen we objectvariabelen)

public static void WijzigDieselprijs(int nieuweprijs)
{dieselprijs = nieuweprijs;}
//Dit is een static methode want ze hoort bij de klasse en moet niet op elk Auto-object worden toegepast

public void berekenPrijs100km()
{
int prijs;
prijs = this.verbruikliterper100km*dieselprijs;
System.out.println("De auto kost" +prijs + " euro op 100 km");
}
//Dit is geen static methode want ze wordt toegepast op een object bijvoorbeeld a2.berkenPrijs100km();
}

NeverwinterX

Legacy Member
Pudmeister zei:
Als je dan objecten a1 en a2 van de klasse Auto maakt, kan je de objectvariabelen bereiken door a1.topsnelheid of a2.merk te schrijven. Dit is echter niet mogelijk bij een klassevariabele (static variabele) want die hoort niet bij een object (instantie) maar wel bij de klasse Auto in het algemeen.

Verwarrend genoeg laten de meeste programmeertalen die syntax wel toe.

Pudmeister

Legacy Member
NeverwinterX zei:
Verwarrend genoeg laten de meeste programmeertalen die syntax wel toe.

Tja normaal gezien gebruikt ge dit ook niet direct in Java aangezien het wordt aangeraden om objectvariabelen private te maken. Vanuit een andere klasse is het dan niet mogelijk om a1.topsnelheid uit te voeren. Men gebruikt dan een zogenaamde gettermethode die wel toegang heeft tot de variabele. In dit voorbeeld zou het dan worden: a1.getTopsnelheid() die de variabele topsnelheid van object a1 returnt.

Nu als ge bijvoorbeeld a1.dieselprijs (dieselprijs = static) invoert dan geeft elke fatsoenlijke Java-editor toch wel een error?

forloRn_

Legacy Member
Pudmeister zei:
Tja normaal gezien gebruikt ge dit ook niet direct in Java aangezien het wordt aangeraden om objectvariabelen private te maken. Vanuit een andere klasse is het dan niet mogelijk om a1.topsnelheid uit te voeren. Men gebruikt dan een zogenaamde gettermethode die wel toegang heeft tot de variabele. In dit voorbeeld zou het dan worden: a1.getTopsnelheid() die de variabele topsnelheid van object a1 returnt.

Nu als ge bijvoorbeeld a1.dieselprijs (dieselprijs = static) invoert dan geeft elke fatsoenlijke Java-editor toch wel een error?

Nee, wel een warning. Uiteindelijk is het ook niet fout, enkel verwarrend.

Of je members nu rechtstreeks aanspreekt of via een getter staat overigens los van de term static. Uiteindelijk kan je ook getters maken die static zijn; logischerwijs kunnen die enkel static members aanspreken.

Pudmeister

Legacy Member
forloRn_ zei:
Nee, wel een warning. Uiteindelijk is het ook niet fout, enkel verwarrend.

Of je members nu rechtstreeks aanspreekt of via een getter staat overigens los van de term static. Uiteindelijk kan je ook getters maken die static zijn; logischerwijs kunnen die enkel static members aanspreken.

Ge hebt gelijk, EasyEclipse runt het maar er komt een warning.

Met de getters bedoelde ik dat het meestal wordt aangeraden om de instantievariabelen zelf private te maken zodat je vanuit een andere klasse geen directe toegang krijgt tot de variabelen (bijvoorbeeld a1.merk vanuit een andere klasse is dan niet mogelijk) Op die manier is de verwarrende syntax gemakkelijk te voorkomen, gewoon variabelen private maken

forloRn_

Legacy Member
De verwarrende syntax is toch het aanspreken van static variabelen via een instance, niet? In welke zin gaat het private maken van instance-variabelen en getters voorzien, voorkomen dat je static variabelen via een instance kan aanspreken? Je mag een voorbeeldje geven hoor.

Pudmeister

Legacy Member
forloRn_ zei:
De verwarrende syntax is toch het aanspreken van static variabelen via een instance, niet? (Inderdaad ;))In welke zin gaat het private maken van instance-variabelen en getters voorzien, voorkomen dat je static variabelen via een instance kan aanspreken? Je mag een voorbeeldje geven hoor.

Excuses ik bedoelde het private maken van de static variabelen (en in't beste geval alle variabelen). Niet specifiek instantievariabelen

Als ge de static variabele private maakt kunt ge ze niet meer bereiken door bijvoorbeeld a1.dieselprijs te schrijven. Dit geeft een error en daarmee is de verwarrende syntax niet meer mogelijk. Hier is een basic voorbeeldje:

Code:
public class Auto{

private static double dieselprijs = 1.55;
private String merk;
private String model;
private int bouwjaar;

public Auto(String merk, String model, int bouwjaar)
{
this.merk = merk;
this.model = model;
this.bouwjaar = bouwjaar;
}
}

Een andere klasse TestAuto waarin de mainmethode staat en we een object a1 maken
Code:
public class TestAuto{

Auto a1 = new Auto("Toyota", "Avensis", 2004);
System.out.println(a1.merk);
System.out.println(a1.dieselprijs); //ERROR: The field Auto.dieselprijs is not visible
}

Deze twee laatste regels geven errors omdat ik alle variabelen private heb gemaakt. Dieselprijs (static) is ook private en dus kan je hem niet bereiken via deze syntax.

forloRn_

Legacy Member
Ja vriend, dat neem ik aan, maar je kunt hem ook niet meer bereiken via Auto.dieselprijs. En getters gaan je niet helpen want zelfs als je die static maakt, kan je ze nog oproepen via een instance. Zoals ik al zei: staticness en visibility staan los van elkaar.

Cycloon

Legacy Member
Je kan wel nog steeds vanuit je auto-klasse aan je private static variabele. Jeej.

Anyway, ik begrijp je punt ook niet. Er is niks verwarrend aan een static variabele opvragen op een instantie van de bijhorende klasse. Quasi alle programmeertalen ondersteunen dat.

NeverwinterX

Legacy Member
Cycloon zei:
Je kan wel nog steeds vanuit je auto-klasse aan je private static variabele. Jeej.

Anyway, ik begrijp je punt ook niet. Er is niks verwarrend aan een static variabele opvragen op een instantie van de bijhorende klasse. Quasi alle programmeertalen ondersteunen dat.

Het is niet omdat veel programmeertalen die historisch slechte beslissing verder ondersteunen dat ie conceptueel niet totaal fout is.

Cycloon

Legacy Member
Ik zie niet waar de conceptuele fout zit, maar voel je vrij om het toe te lichten.

NeverwinterX

Legacy Member
Cycloon zei:
Ik zie niet waar de conceptuele fout zit, maar voel je vrij om het toe te lichten.

Static methodes horen conceptueel bij de klasse. Syntax toevoegen om het op een instance variabele te kunnen doen, voegt niks toe want je kan even goed de klassenaam typen en het maakt het moeilijker om te begrijpen. Bad design ten top, voortvloeiend uit het willen volgen van de c++ syntax. Het is niet zonder reden dat de meeste compilers en IDE's een warning zullen geven.

Cycloon

Legacy Member
Omdat je een static oproept op een instance variabele begin je te spreken over 'bad design'. Als design van een applicatie al afhangt van een enkele regel code dan is het ver gekomen. En ook al definieer je een statische variabele op klasse niveau, toch is ze ook onderdeel van alle instanties.

Ik wacht nog steeds op je uitleg waar de conceptuele fout zit. Het is niet omdat een bepaald concept bij sommigen tot verwarring leidt dat het een slecht concept is. Als dat toch zo zou zijn dan moet ik persoonlijk heel veel concepten als foutief bestempelen.

Pudmeister

Legacy Member
Cycloon zei:
En ook al definieer je een statische variabele op klasse niveau, toch is ze ook onderdeel van alle instanties.

Een static variabele staat toch volledig los van instanties... Ook wanneer er geen instanties zijn kan je static variabelen ook bereiken. Ik snap niet wat je bedoelt. Een static var hoort bij de klasse op zich en niet bij de objecten van die klasse. Het is toch niet voor niks dat ge een warning krijgt wanneer ge via een instance een static variabele wilt oproepen? Static variabelen worden via de klasse opgeroepen en niet via objecten van die klasse.

stel de variabele dieselprijs is static

Auto.dieselprijs geeft geen warning
a1.dieselprijs geeft wel een warning: The static field Auto.dieselprijs should be accessed in a static way

I rest my case

NoGo

Legacy Member
Ik vraag mij eigenlijk af wat het nut is om a1.dieselprijs te gebruiken ipv Auto.dieselprijs :p Waarom zou je dit gebruiken?

NeverwinterX

Legacy Member
Cycloon zei:
Omdat je een static oproept op een instance variabele begin je te spreken over 'bad design'. Als design van een applicatie al afhangt van een enkele regel code dan is het ver gekomen.

Bad design van de programmeertaal.
Als je het gebruikt in je code moet je het zelf maar weten als er praktisch universele consensus is dat je dat beter niet doet.

blackrabbit

Legacy Member
Dan gaat het niet om bad design van de taal, eerder om intelligent ontwikkeling van de compiler tegen domme fouten van de ontwikkelaar
Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.
Terug
Bovenaan