Volg de onderstaande video om te zien hoe je onze site als web-app op je startscherm installeert.
Opmerking: Deze functie is mogelijk niet beschikbaar in sommige browsers.
public class Outer {
private static class Inner {
private static Object member; // static, compileert niet
}
}
Fraggie zei:Okay:
- Een static var staat ergens op een vaste plaats in het geheugen, los van een object dus. Alle objecten kunnen deze raadplegen/manipuleren. We zeggen dat hij eigen is aan een klasse en niet een object.
Fraggie zei:- Een interne klasse is een instantie van een top-level klasse. Bij het aanmaken van de top-level klasse wordt er dus geheugen vrij gemaakt voor de uitwendige en inwendige klasse. Probeer dit te zien als 1 geheel.
Fraggie zei:- Als je dus een static var, in een interne klasse gedefinieerd hebt, die zelf niet static is, dan zou je per top-level object, een nieuwe static var gemaakt hebben. Nu bind je dus wel een static var aan een object, en niet aan een klasse.
De compiler kan dus onmogelijk de static modifier toepassen op jou var, omdat ze object gebonden is.
Gewoon als je een object aanmaakt van je Outer klasse, dan moet er sowieso geheugen vrij gemaakt worden binnen het object van je Outer klasse, om de Inner te kunnen gebruiken.forloRn_ zei:Wat bedoel je met "een interne klasse is een instantie van een top-level klasse?" Wat bedoel je met het aanmaken van de top-level klasse? Classloading of instantiëren?
Aja, das juist om een punt te bewijzen heforloRn_ zei:Static staat toch sowieso los van instanties? Volgens mij spreek je hier je eerste punt tegen.
. Let op de "zou" en volgende uitleg.Fraggie zei:Gewoon als je een object aanmaakt van je Outer klasse, dan moet er sowieso geheugen vrij gemaakt worden binnen het object van je Outer klasse, om de Inner te kunnen gebruiken.
M.a.w. bij het initialiseren/aanmaken van je top-level klasse.
public class Outer {
public Outer() {
System.out.println("Outer ctor");
}
private class Inner {
Inner() {
System.out.println("Inner ctor");
}
}
public static void main(String[] args) {
new Outer();
new Outer();
new Outer();
}
}
Nee nee, ik heb dat blijkbaar verkeerd verwoord.forloRn_ zei:Het instantiëren van Outer wilt toch niet zeggen dat er ook een Inner geïnstantieerd wordt?
Fraggie zei:De Inner class is een instantie van de Outer class.
Dit komt letterlijk uit de Java tutorial:forloRn_ zei:Dat tekeningetje wilt toch gewoon zeggen dat een inner class een referentie heeft naar haar outer class, en dat ze aan alle members van die outer class kan.
Oke ik geef toe dat die zin nu totaal niet klopt, maar je zou nu toch al moeten weten in welke richting ik ga.forloRn_ zei:Met permissie, maar dat slaat op niks.
))Hoe bedoel je juist?forloRn_ zei:Outer en Inner behoren niet tot dezelfde klassenhiërarchie. Je kunt de ene klasse zelfs laden zonder dat de andere geladen wordt en omgekeerd.
forloRn_ zei:Code:Deze code compileert niet. Ik zie niet in waarom Inner geen static member kan hebben die gedeeld wordt door alle instances van Inner. [/QUOTE] Zal gewoon een beslissing zijn van Java in hun design. (of eventueel om een historische reden, dunno) De reden waarom het niet toegelaten is zal je volgens mij niet echt kunnen achterhalen, tenzij iemand van Java zelf er een statement over gemaakt heeft.
Okay, laat me toe om het nog 1x te proberen:forloRn_ zei:Dat mag je toch niet letterlijk nemen. 't Is niet omdat wij objecten als een mooi geheel zien dat ze daarom ook netjes een continu gebied in het geheugen innemen. Hoe ze juist in het geheugen terechtkomen is interne keuken van het virtual machine en het OS en staat los van Java op zich.
Outer en Inner behoren niet tot dezelfde klassenhiërarchie. Je kunt de ene klasse zelfs laden zonder dat de andere geladen wordt en omgekeerd.
public class Inner
{
private static Object member;
}
public class Outer
{
int x;
Inner innerObject;
public Outer(int x)
{
this.x = x;
innerObject = new Inner();
}
}
Fraggie zei:[*] Stel nu dat jij gelijkt hebt, en er alleen referenties naar Inner objecten in een Outer object staan. Dan vind ik dat als je 1 Outer object en 20 Inner objecten aanmaakt, en je het Outer object vrij geeft de Inner objecten moeten blijven bestaan. Want ze bestaan op hen eentje zonder link/klassenhiërarchie naar het Outer object, zoals jij hier zegt: