Lux.Architectuur | Van Dromen tot Wonen | www.Lux-a.nl
Maar het gaat om de variabele messageTimer, deze variabele wordt wel ergens gedeclareerd, maar mogelijk niet geinitialiseerd, kijke je code even goed door, specifiek voor de variabele messageTimer.
Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'
Lux.Architectuur | Van Dromen tot Wonen | www.Lux-a.nl
De wereld ligt aan je voeten. Je moet alleen diep genoeg willen bukken...
"Wie geen fouten maakt maakt meestal niets!"
Als je superclass geen constructor zonder parameters heeft, dan zul je zelf eentje moeten aanroepen.
There are 10 kinds of people in the world: those that understand binary and those that don't
De impliciete constructor wordt alleen aangemaakt als er geen enkele constructor opgegeven is. Als je dus één constructor met een parameter opgeeft moet je ook de lege aanmaken (mocht je deze willen)Silentuz schreef op zaterdag 05 december 2009 @ 17:34:
elke class heeft in java toch impliciet een constuctor zonder parameters?
Verwijderd
Een afgeleide klasse met een lege constructor doet stiekem dit:
1
2
3
4
5
6
7
| ChildClass extends FrameView { public ChildClass() { super(); // FrameView() } } |
Zoals je ziet wordt er dan een lege parentconstructor aangeroepen, terwijl die niet bestaat voor FrameView. Logisch dus dat het niet werkt!
Je kunt echter ook argumenten doorgeven aan super. Nu zou je kunnen denken, 'Ik initaliseer eerst de timer' in m'n ChildClass constructor en daarna geef ik het door aan de superklasse constructor.':
1
2
3
4
5
6
7
8
9
| ChildClass extends FrameView { public ChildClass() { Timer messageTimer = new Timer(); // Geen idee welk type messageTimer is. // Mag niet, super() moet het eerste statement van de constructor zijn! super(messageTimer); // FrameView(messageTimer). } } |
Maar helaas, dat mag niet. De de super() methode moet namelijk altijd aan het begin van de childconstructor staan.
Wat blijft er dan over? Het argument dat de super() methode nodig heeft, ook doorgeven aan de childconstructor:
1
2
3
4
5
6
7
| ChildClass extends FrameView { public ChildClass(Timer messageTimer)// Geen idee welk type messageTimer is. { super(messageTimer); // FrameView(messageTimer) } } |
Ik hoop dat ik geen grove fouten heb gemaakt in m'n uitleg (ben nog niet heel lang bezig in Java). Wellicht zijn er ook nog andere manieren waarop je het probleem op kan lossen. Voor meer info over constructors zie hier.
Dat gaat niet lukken omdat messageTimer nog niet geinitialiseerd is. Je moet "super(new MessageTimer());" gebruiken, Dit creeert een MessageTimer en geeft die meteen door aan de super constructor.[b][message=33050246,noline]Java:
1 2 3 4 5 6 7 ChildClass extends FrameView { public ChildClass(Timer messageTimer)// Geen idee welk type messageTimer is. { super(messageTimer); // FrameView(messageTimer) } }
More than meets the eye
There is no I in TEAM... but there is ME
system specs
FrameView verwacht een Application als parameter
Dus:
1
2
3
4
| public JavaOdr3View() { super(...); } |
Ik weet niet hoe je die application moet halen? Dat weet jij waarschijnlijk wel
[ Voor 38% gewijzigd door Snake op 06-12-2009 15:12 ]
Going for adventure, lots of sun and a convertible! | GMT-8
Uit de api javadoc:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
| public class MyApplication extends Application { JFrame mainFrame = null; @Override protected void startup() { mainFrame = new JFrame("Hello World"); mainFrame.add(new JLabel("Hello World")); mainFrame.addWindowListener(new MainFrameListener()); mainFrame.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE); mainFrame.pack(); mainFrame.setVisible(true); } @Override protected void shutdown() { mainFrame.setVisible(false); } private class MainFrameListener extends WindowAdapter { public void windowClosing(WindowEvent e) { exit(); } } public static void main(String[] args) { Application.launch(MyApplication.class, args); } } |
Be fast .... Be furious....
Tuurlijk wel, want in zijn voorbeeld is messageTimer een parameter van de constructor: die moet dus meegegeven worden bij de aanroep van de constructor en wordt dan doorgegeven naar de superclass.IceManX schreef op zondag 06 december 2009 @ 15:07:
[...]
Dat gaat niet lukken omdat messageTimer nog niet geinitialiseerd is. Je moet "super(new MessageTimer());" gebruiken, Dit creeert een MessageTimer en geeft die meteen door aan de super constructor.
1) aanroep super constructor (al dan niet de parameter-loze constructor die impliciet wordt aangeroepen)
2) initializer blocks + initializers van fields die bij de declaratie geinitialiseerd worden (bv int x = 5)
3) de rest van de constructor
Aangezien messageTimer op zijn vroegst in stap 2 geiniitialiseerd kan worden maar al in stap 1 wordt aangeroepen, kan deze nooit een waarde hebben. De compiler ziet dit en zal dus een error geven.
In de super constructor call kun je alleen maar static fields, literals, constructor parameters en nieuwe objecten (in de vorm van "new X(...)") meegeven. Ook de return waarde van niet-static methods zijn niet toegestaan maar van static methods weer wel.
Na de super call is alles "fair game".
D'OH! Ik zie nu pas dat messageTimer een constructor parameter is, dus je hebt volkomen gelijk. Het compilet wel zonder problemen.
[ Voor 7% gewijzigd door Robtimus op 08-12-2009 13:51 ]
More than meets the eye
There is no I in TEAM... but there is ME
system specs