Toon posts:

[Java]Static

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik heb een klein vraagje over het gebruik van static. Mijn idee is dat op het moment dat je een statische klassevariabele voor de eerste keer aanroept, deze wordt geinitialiseerd en in het geheugen geplaatst. Bij latere aanroepen wordt dit gebruikt( jaja als het een object is waarvan de waarden veranderen zal er wel meer gebeuren, maar de referentie blijft hetzelfde).

Nou is mijn vraag
Blijft deze de hele tijd in het geheugen zitten, dus bij grote objecten nemen deze veel plaats in. Of wordt deze verwijderd op het moment dat er geen referentie meer naar zijn en later weer opnieuw aangemaakt. Wat zou betekenen dat als je in de contructor van die klasse bijvoorbeeld een Math.random() aanroept deze niet hetzelfde is.

  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024

Alarmnummer

-= Tja =-

Ze blijven bestaan en ze worden niet ge-garbage-collect.

  • matthijsln
  • Registratie: Augustus 2002
  • Laatst online: 28-04 15:07
Ze blijven bestaan zolang er nog een referentie naar de class is en indien er geen referenties meer naar zijn totdat de class wordt geunload.

[ Voor 40% gewijzigd door matthijsln op 13-08-2005 01:18 ]


  • Macros
  • Registratie: Februari 2000
  • Laatst online: 30-04 09:28

Macros

I'm watching...

matthijsln schreef op zaterdag 13 augustus 2005 @ 01:14:
Ze blijven bestaan zolang er nog een referentie naar de class is en indien er geen referenties meer naar zijn totdat de class wordt geunload.
Ik kan me ook herinneren dat classes geunload kunnen worden. Maar volgens mij gebeurd die niet zomaar. Als er 0 instances van die class op de heap staan kan nog de class niet zomaar geunload worden. Statische waardes kunnen nog gereferenced worden in de toekomst, eventueel dmv. reflectie, welke dan eventueel een andere waarde hebben.

Oke, ik heb het opgezocht. Classes kunnen gegarbage collect worden, maar alleen als de custom classloader die je hebt gebruikt om die classes te laden gegarbage collect wordt. Die houdt namelijk een lijst (Vector) met referenties naar de classes die het geladen heeft bij. Als de GC besluit de classloader te collecten, dan kan hij dat doen als er geen referenties meer zijn naar alle klassen die zijn geladen door die classloader.

[ Voor 27% gewijzigd door Macros op 13-08-2005 06:33 ]

"Beauty is the ultimate defence against complexity." David Gelernter


  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024

Alarmnummer

-= Tja =-

Macros schreef op zaterdag 13 augustus 2005 @ 05:12:
[...]
Oke, ik heb het opgezocht. Classes kunnen gegarbage collect worden, maar alleen als de custom classloader die je hebt gebruikt om die classes te laden gegarbage collect wordt. Die houdt namelijk een lijst (Vector) met referenties naar de classes die het geladen heeft bij. Als de GC besluit de classloader te collecten, dan kan hij dat doen als er geen referenties meer zijn naar alle klassen die zijn geladen door die classloader.
Ok.. maar voor normale stervelingen: zal er gegarbagecollect worden als je gewoon de default classloader gebruikt?

  • Glimi
  • Registratie: Augustus 2000
  • Niet online

Glimi

Designer Drugs

(overleden)
Alarmnummer schreef op zaterdag 13 augustus 2005 @ 08:25:
Ok.. maar voor normale stervelingen: zal er gegarbagecollect worden als je gewoon de default classloader gebruikt?
Nee, omdat de default classloader altijd geladen blijft.

[ Voor 10% gewijzigd door Glimi op 13-08-2005 10:44 ]


  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024

Alarmnummer

-= Tja =-

Glimi schreef op zaterdag 13 augustus 2005 @ 10:40:
[...]

Nee, omdat de default classloader altijd geladen blijft.
En hiermee is de vraag van de TS meteen beantwoord.

  • Daos
  • Registratie: Oktober 2004
  • Niet online
Verwijderd schreef op zaterdag 13 augustus 2005 @ 00:26:
...

Nou is mijn vraag
Blijft deze de hele tijd in het geheugen zitten, dus bij grote objecten nemen deze veel plaats in. Of wordt deze verwijderd op het moment dat er geen referentie meer naar zijn en later weer opnieuw aangemaakt. Wat zou betekenen dat als je in de contructor van die klasse bijvoorbeeld een Math.random() aanroept deze niet hetzelfde is.
Static heeft niets met objecten te maken. Static variabelen horen bij de klasse. Deze komen daarom maar 1 keer in het geheugen te staan en niet in elk object.
De constructor wordt aangeroepen als er een object gemaakt is. De constructor heeft dus niets met static te maken. De klasse zelf heeft geen constructor. Het is wel mogelijk de statische variabelen een initiele waarde te geven. Bijvoorbeeld:
Java:
1
2
3
class Klasse {
  static double getalletje = Math.random();
}


De rest van het verhaal staat al in de andere berichten.

[ Voor 6% gewijzigd door Daos op 13-08-2005 12:15 ]


  • Onno
  • Registratie: Juni 1999
  • Niet online
Daos schreef op zaterdag 13 augustus 2005 @ 11:59:
De klasse zelf heeft geen constructor.
Nou.. dat zou ik niet zeggen:
Java:
1
2
3
4
5
6
7
8
9
static double getalletje;

static {
    getalletje = Math.random();
    if (getalletje > 0.5)
    {
        getalletje += 14;
    }
}

Dat is geen simpele initiële waarde meer, dat is hetzelfde als een constructor voor een object is.

  • Daos
  • Registratie: Oktober 2004
  • Niet online
Onno schreef op zaterdag 13 augustus 2005 @ 12:08:
[...]

Nou.. dat zou ik niet zeggen:
Java:
1
2
3
4
5
6
7
8
9
static double getalletje;

static {
    getalletje = Math.random();
    if (getalletje > 0.5)
    {
        getalletje += 14;
    }
}

Dat is geen simpele initiële waarde meer, dat is hetzelfde als een constructor voor een object is.
Dat is een Static Initializer, dat is hetzelde als een Instance Initializer voor een object is. Zoals ik al zei: De klasse zelf heeft geen constructor.
Pagina: 1