Thread: Static/Final
-
25-04-2012, 16:58 #1
Static/Final
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 !
Grtzno votes
-
-
25-04-2012, 17:47 #2Member
- Registered
- 08/09/02
- Location
- -
- Posts
- 2,044
- iTrader
- 9 (100%)
- Mentioned
- 0 Post(s)
- Reputation
- 3/6
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.no votes
-
25-04-2012, 20:04 #3
Oke thanks!
no votes
-
25-04-2012, 20:23 #4
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(); }no votes
-
25-04-2012, 20:33 #5Approved 9-lifer
- Registered
- 27/08/04
- Location
- Leuven
- Posts
- 930
- iTrader
- 0
- Mentioned
- 0 Post(s)
- Reputation
- 11/38
I am thee and thou art me and all of one is the other.
TED talk: Richard Dawkins on militant atheismno votes
-
25-04-2012, 20:45 #6
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?no votes
-
25-04-2012, 21:44 #7Member
- Registered
- 23/11/03
- Location
- Landeurp
- Posts
- 1,791
- iTrader
- 0
- Mentioned
- 0 Post(s)
- Reputation
- 10/17
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.no votes
-
25-04-2012, 22:13 #8
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 makenno votes
-
25-04-2012, 22:28 #9Member
- Registered
- 23/11/03
- Location
- Landeurp
- Posts
- 1,791
- iTrader
- 0
- Mentioned
- 0 Post(s)
- Reputation
- 10/17
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.
no votes
-
26-04-2012, 10:06 #10
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:
Een andere klasse TestAuto waarin de mainmethode staat en we een object a1 makenCode: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; } }
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.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 }no votes
-
26-04-2012, 19:05 #11Member
- Registered
- 23/11/03
- Location
- Landeurp
- Posts
- 1,791
- iTrader
- 0
- Mentioned
- 0 Post(s)
- Reputation
- 10/17
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.
no votes
-
26-04-2012, 20:27 #12Approved 9liver
- Registered
- 18/01/04
- Location
- Melle
- Posts
- 10,535
- iTrader
- 56 (100%)
- Mentioned
- 0 Post(s)
- Reputation
- 27/102
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.“In terms of how we evaluate schooling, everything is about working by yourself. If you work with someone else, it’s called cheating. Once you get out in the real world, everything you do involves working with other people.”
PSN: Cycloon - Final Fantasy XIV: A realm reborn characterno votes
-
26-04-2012, 21:27 #13Approved 9-lifer
- Registered
- 27/08/04
- Location
- Leuven
- Posts
- 930
- iTrader
- 0
- Mentioned
- 0 Post(s)
- Reputation
- 11/38
I am thee and thou art me and all of one is the other.
TED talk: Richard Dawkins on militant atheismno votes
-
26-04-2012, 22:19 #14Approved 9liver
- Registered
- 18/01/04
- Location
- Melle
- Posts
- 10,535
- iTrader
- 56 (100%)
- Mentioned
- 0 Post(s)
- Reputation
- 27/102
Ik zie niet waar de conceptuele fout zit, maar voel je vrij om het toe te lichten.
“In terms of how we evaluate schooling, everything is about working by yourself. If you work with someone else, it’s called cheating. Once you get out in the real world, everything you do involves working with other people.”
PSN: Cycloon - Final Fantasy XIV: A realm reborn characterno votes
-
26-04-2012, 22:26 #15Approved 9-lifer
- Registered
- 27/08/04
- Location
- Leuven
- Posts
- 930
- iTrader
- 0
- Mentioned
- 0 Post(s)
- Reputation
- 11/38
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.
I am thee and thou art me and all of one is the other.
TED talk: Richard Dawkins on militant atheismno votes

