[JAVA] Constructor van extended classe

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • battler
  • Registratie: November 2004
  • Laatst online: 30-06 15:11
Er is een classe die frameview extend.

Nu genereert Netbeans ook een constructor ( maar die slikt iets). Nu wil ik een eigen constructor maken maar hij komt altijd met de volgende error:

Afbeeldingslocatie: http://img121.imageshack.us/img121/1099/screenshot20091204at350.png

Iemand enig idee waarom dit niet kan?

http://www.devdaily.com/java/java_oo/node107.shtml

Lux.Architectuur | Van Dromen tot Wonen | www.Lux-a.nl


Acties:
  • 0 Henk 'm!

  • Arie-
  • Registratie: December 2008
  • Niet online
Relevante code?
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.

Acties:
  • 0 Henk 'm!

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 16-09 09:15

Janoz

Moderator Devschuur®

!litemod

Ik ken FrameView niet, maar ik vermoed dat deze class geen parameterloze constructor heeft. Je zult dus zelf specifiek aan moeten geven welke constructor van de superclass gebruikt moet worden.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Acties:
  • 0 Henk 'm!

  • battler
  • Registratie: November 2004
  • Laatst online: 30-06 15:11
Ik kan niet een eigen constructor aanmaken die niet voor komt in mijn super class?

Lux.Architectuur | Van Dromen tot Wonen | www.Lux-a.nl


Acties:
  • 0 Henk 'm!

  • Arie-
  • Registratie: December 2008
  • Niet online
Ja dat kan, maar het allereerste wat je dan altijd moet doen in je 'eigen' constructor, is de constructor van je 'super'-klasse aanroepen met de correcte parameters.

Acties:
  • 0 Henk 'm!

  • NetForce1
  • Registratie: November 2001
  • Laatst online: 16:09

NetForce1

(inspiratie == 0) -> true

Volgens mij heb je een final field 'messageTimer' in je klasse, deze zal je moeten initialiseren in je eigen constructor, of non-final maken.

De wereld ligt aan je voeten. Je moet alleen diep genoeg willen bukken...
"Wie geen fouten maakt maakt meestal niets!"


Acties:
  • 0 Henk 'm!

  • Observer
  • Registratie: April 2001
  • Laatst online: 02:05
In een constructor roept Java roept altijd de default constructor aan van de superclass (dus zonder arameters), tenzij je zelf als eerste statement een andere constructor aanroept (waar hetzelfde verhaal weer van toepassing is).
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


Acties:
  • 0 Henk 'm!

  • Silentuz
  • Registratie: Mei 2004
  • Laatst online: 14-03 12:37

Silentuz

-_-

elke class heeft in java toch impliciet een constuctor zonder parameters?

Acties:
  • 0 Henk 'm!

  • nnomiS
  • Registratie: Oktober 2000
  • Laatst online: 22:46
Silentuz schreef op zaterdag 05 december 2009 @ 17:34:
elke class heeft in java toch impliciet een constuctor zonder parameters?
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)

Acties:
  • 0 Henk 'm!

Verwijderd

Zie de reply van Janoz. Het lijkt erop alsof FrameView een variabele messageTimer heeft, die alleen met behulp van de constructor van FrameView wordt geïnitialiseerd. Gevolg: FrameView heeft geen geen constructor zonder argumenten.

Een afgeleide klasse met een lege constructor doet stiekem dit:
Java:
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.':

Java:
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:
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)
    }
}


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.

Acties:
  • 0 Henk 'm!

  • Robtimus
  • Registratie: November 2002
  • Laatst online: 17-09 14:19

Robtimus

me Robtimus no like you

[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)
    }
}
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.

More than meets the eye
There is no I in TEAM... but there is ME
system specs


Acties:
  • 0 Henk 'm!

  • Snake
  • Registratie: Juli 2005
  • Laatst online: 07-03-2024

Snake

Los Angeles, CA, USA

https://appframework.dev....Framework-1.03/index.html

FrameView verwacht een Application als parameter :)

Dus:

Java:
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


Acties:
  • 0 Henk 'm!

  • Bl4ckviper
  • Registratie: Mei 2002
  • Laatst online: 06-08 00:09

Bl4ckviper

BlaBlaBla

Die moet hij zelf ook even maken.

Uit de api javadoc:

Java:
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....


Acties:
  • 0 Henk 'm!

  • Remus
  • Registratie: Juli 2000
  • Laatst online: 15-08-2021
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.
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.

Acties:
  • 0 Henk 'm!

  • Robtimus
  • Registratie: November 2002
  • Laatst online: 17-09 14:19

Robtimus

me Robtimus no like you

Ware het niet dat die variabele dan nooit geinitialiseerd kan zijn. De volgorde is namelijk:
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

Pagina: 1