Pagina 1 van 2 12 LaatsteLaatste
Weergegeven resultaten: 1 t/m 20 van 31

Discussie: Static/Final

  1. #1
    Member LilWeezy's schermafbeelding
    Lid sinds
    22/07/11
    Locatie
    Bruxelles
    Berichten
    45
    iTrader
    0

    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 !

    Grtz

  2. #2
    Member Jerre Muesli's schermafbeelding
    Lid sinds
    8/09/02
    Locatie
    -
    Berichten
    2.012
    iTrader
    9 (100%)
    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.

  3. #3
    Member LilWeezy's schermafbeelding
    Lid sinds
    22/07/11
    Locatie
    Bruxelles
    Berichten
    45
    iTrader
    0
    Oke thanks!

  4. #4
    Member Pudmeister's schermafbeelding
    Lid sinds
    20/08/11
    Locatie
    Liberty City
    Berichten
    824
    iTrader
    0
    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();
    }
    PSN: Pudmeister89

  5. #5
    Approved 9-lifer NeverwinterX's schermafbeelding
    Lid sinds
    26/08/04
    Locatie
    Leuven
    Berichten
    887
    iTrader
    0
    Citaat Oorspronkelijk geplaatst door Pudmeister Bekijk bericht
    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.

  6. #6
    Member Pudmeister's schermafbeelding
    Lid sinds
    20/08/11
    Locatie
    Liberty City
    Berichten
    824
    iTrader
    0
    Citaat Oorspronkelijk geplaatst door NeverwinterX Bekijk bericht
    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?

  7. #7
    Member forloRn_'s schermafbeelding
    Lid sinds
    23/11/03
    Locatie
    Landeurp
    Berichten
    1.725
    iTrader
    0
    Citaat Oorspronkelijk geplaatst door Pudmeister Bekijk bericht
    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.

  8. #8
    Member Pudmeister's schermafbeelding
    Lid sinds
    20/08/11
    Locatie
    Liberty City
    Berichten
    824
    iTrader
    0
    Citaat Oorspronkelijk geplaatst door forloRn_ Bekijk bericht
    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

  9. #9
    Member forloRn_'s schermafbeelding
    Lid sinds
    23/11/03
    Locatie
    Landeurp
    Berichten
    1.725
    iTrader
    0
    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.

  10. #10
    Member Pudmeister's schermafbeelding
    Lid sinds
    20/08/11
    Locatie
    Liberty City
    Berichten
    824
    iTrader
    0
    Citaat Oorspronkelijk geplaatst door forloRn_ Bekijk bericht
    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.

  11. #11
    Member forloRn_'s schermafbeelding
    Lid sinds
    23/11/03
    Locatie
    Landeurp
    Berichten
    1.725
    iTrader
    0
    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.

  12. #12
    Approved 9-lifer Cycloon's schermafbeelding
    Lid sinds
    17/01/04
    Locatie
    Melle
    Berichten
    9.378
    iTrader
    47 (100%)
    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.

  13. #13
    Approved 9-lifer NeverwinterX's schermafbeelding
    Lid sinds
    26/08/04
    Locatie
    Leuven
    Berichten
    887
    iTrader
    0
    Citaat Oorspronkelijk geplaatst door Cycloon Bekijk bericht
    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.

  14. #14
    Approved 9-lifer Cycloon's schermafbeelding
    Lid sinds
    17/01/04
    Locatie
    Melle
    Berichten
    9.378
    iTrader
    47 (100%)
    Ik zie niet waar de conceptuele fout zit, maar voel je vrij om het toe te lichten.

  15. #15
    Approved 9-lifer NeverwinterX's schermafbeelding
    Lid sinds
    26/08/04
    Locatie
    Leuven
    Berichten
    887
    iTrader
    0
    Citaat Oorspronkelijk geplaatst door Cycloon Bekijk bericht
    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.

  16. #16
    Approved 9-lifer Cycloon's schermafbeelding
    Lid sinds
    17/01/04
    Locatie
    Melle
    Berichten
    9.378
    iTrader
    47 (100%)
    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.

  17. #17
    Member Pudmeister's schermafbeelding
    Lid sinds
    20/08/11
    Locatie
    Liberty City
    Berichten
    824
    iTrader
    0
    Citaat Oorspronkelijk geplaatst door Cycloon Bekijk bericht
    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

  18. #18
    Approved 9-lifer NoGo's schermafbeelding
    Lid sinds
    22/08/11
    Locatie
    Borgloon
    Berichten
    967
    iTrader
    95 (100%)
    Ik vraag mij eigenlijk af wat het nut is om a1.dieselprijs te gebruiken ipv Auto.dieselprijs Waarom zou je dit gebruiken?

  19. #19
    Approved 9-lifer NeverwinterX's schermafbeelding
    Lid sinds
    26/08/04
    Locatie
    Leuven
    Berichten
    887
    iTrader
    0
    Citaat Oorspronkelijk geplaatst door Cycloon Bekijk bericht
    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.

  20. #20
    Member blackrabbit's schermafbeelding
    Lid sinds
    25/07/02
    Locatie
    Wemmel
    Berichten
    1.133
    iTrader
    5 (100%)
    Dan gaat het niet om bad design van de taal, eerder om intelligent ontwikkeling van de compiler tegen domme fouten van de ontwikkelaar

Pagina 1 van 2 12 LaatsteLaatste

Discussie informatie

Users Browsing this Thread

Op dit moment bekijken 1 gebruikers deze discussie. (0 leden en 1 gasten)

Regels voor berichten

  • Je mag geen nieuwe discussies starten
  • Je mag niet reageren op berichten
  • Je mag geen bijlagen versturen
  • Je mag niet je berichten bewerken
  •