Archief - [PROG]Java Klassen aanroepen?

Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.

f00raap

Legacy Member
Beste teleneters,

Ik ben een applet aan het schrijven waarmee je een ballon kan laten groeien en krimpen. Ik gebruik daarvoor een klasse Ballon die ik vroeger geschreven heb.

Mijn vraag is hoe kan ik al de methoden aanroepen in mijn hoofklasse(Oef8_4)?
Zo lukt het in elk geval niet: class Groeien extends Ballon{
}
en dan in de klasse van Oef8_4 : Ballon vergroot = new Ballon();
Ik dacht dat ik dan met set en get deze methoden kon gebruiken?!


M"n code:
Code:
import java.applet.*;
import java.awt.*;
import java.awt.event.*;

public class Oef8_4 extends Applet implements ActionListener {
    Button cmdVergroot;
    Button cmdVerlaag;
    boolean geklikt=false;
    String boodschap;
    Ballon vergroot = new Ballon();

    public void init(){
           cmdVergroot= new Button("Vergroot ballon");
           add(cmdVergroot);
           cmdVergroot.addActionListener(this);

           cmdVerlaag= new Button("Verlaag ballon");
           add(cmdVerlaag);
           cmdVerlaag.addActionListener(this);
    }
    public void paint(Graphics g){
           if(geklikt=true){
              g.drawString(boodschap,10,20);
           }
    }

    public void actionPerformed(ActionEvent e){
           if(e.getSource()==cmdVerlaag){
           boodschap="Verlaag";
           }
           if(e.getSource()==cmdVergroot){
           boodschap="Verhoog";
           }
           repaint();
    }
}

    abstract class Ballon {
    //Attributen
    int diameter;
    int xCoord;
    int yCoord;

    //Constructions
    Ballon(int initDiameter, int initXCoord, int initYCoord){
               diameter=initDiameter;
               xCoord=initXCoord;
               yCoord=initYCoord;
    }
    Ballon(int initXCoord, int initYCoord){
               diameter=10;
               xCoord=initXCoord;
               yCoord=initYCoord;
    }

    //methoden
    public void actionPerformed(){
    }
    public void naarRechts(){
         xCoord += 10;
    }
    public void naarRechts(int afstand){
         xCoord += afstand;
    }
    public void naarLinks(){
         xCoord -= 10;
    }
    public void naarLinks(int afstand){
         xCoord -= afstand;
    }
    public void naarBoven(){
         yCoord += 10;
    }
    public void naarBoven(int afstand){
         yCoord += afstand;
    }
    public void naarBeneden(){
         yCoord -= 10;
    }
    public void naarBeneden(int afstand){
         yCoord -= afstand;
    }
    public void groeien(){
          diameter += 10;
    }
    public void krimpen(){
          diameter -=10;
    }
}
class Groeien extends Ballon {

}

De fout die ik altijd krijg is connot resolve symbol bij:
Ballon vergroot = new Ballon();
en bij:
class Groeien extends Ballon {

}

Mvg f00raap

WHiSPy

Legacy Member
Ballon is een abstracte klasse. Last time I checked kunt ge daar geen instantie van maken. Ik zou toch eerst eens de theorie achter OO bekijken voor ge u er head first in gooit.

Kn0t

Legacy Member
Je hebt geen Ballon constructor zonder argumenten. Ofwel roep je de juiste constructor aan, ofwel maak je een constructor zonder argumenten.

Btw:

if (geklikt=true) -> verander dat maar in geklikt==true ;)

Rajiv

Legacy Member
Kn0t zei:
if (geklikt=true) -> verander dat maar in geklikt==true ;)
if(geklikt) ;)

verder:
maak constructor bij uw Groeien klasse, (no-) argument
roep vervolgens uw klasse aan, bvb Groeien test = new Ballon() of Groeien test2 = new Groeien()
compiler voorziet trouwens standaard een no-argument constructor

en zoals gezegd, basic oo, mss eerst theorie eens doorbladeren, abstracte klasse kan niet geinitializeerd worden! Je kan wel methoden static maken en die aanroepen

Kn0t

Legacy Member
Mjah idd, if(geklikt) is nog beter :) 'k wou alleen ff het verschil tussen = (toekenning) en == (gelijkheid) aanduiden.

De compiler voorziet inderdaad een standaard no-arg constructor, die gewoon de no-arg constructor van de parent klasse zal oproepen -> super();

Maar die constructor wordt enkel gegenereerd wanneer je zelf geen andere constructors hebt gedefinieerd, wat hier dus niet opgaat voor je Ballon klasse.

Dat is ook de reden waarom je die fout van "cannot resolve symbol Ballon()" 2 keer krijgt.

Eén keer bij het expliciet oproepen van deze constructor in je applet klasse, en een tweede keer bij het genereren van de default constructor van de Groeien klasse, die impliciet super(); zal oproepen.

jodeman

Legacy Member
f00raap zei:
Beste teleneters,

Ik ben een applet aan het schrijven waarmee je een ballon kan laten groeien en krimpen. Ik gebruik daarvoor een klasse Ballon die ik vroeger geschreven heb.

Mijn vraag is hoe kan ik al de methoden aanroepen in mijn hoofklasse(Oef8_4)?
Zo lukt het in elk geval niet: class Groeien extends Ballon{
}
en dan in de klasse van Oef8_4 : Ballon vergroot = new Ballon();
Ik dacht dat ik dan met set en get deze methoden kon gebruiken?!


M"n code:
Code:
import java.applet.*;
import java.awt.*;
import java.awt.event.*;

public class Oef8_4 extends Applet implements ActionListener {
    Button cmdVergroot;
    Button cmdVerlaag;
    boolean geklikt=false;
    String boodschap;
    Ballon vergroot = new Ballon();

    public void init(){
           cmdVergroot= new Button("Vergroot ballon");
           add(cmdVergroot);
           cmdVergroot.addActionListener(this);

           cmdVerlaag= new Button("Verlaag ballon");
           add(cmdVerlaag);
           cmdVerlaag.addActionListener(this);
    }
    public void paint(Graphics g){
           if(geklikt=true){
              g.drawString(boodschap,10,20);
           }
    }

    public void actionPerformed(ActionEvent e){
           if(e.getSource()==cmdVerlaag){
           boodschap="Verlaag";
           }
           if(e.getSource()==cmdVergroot){
           boodschap="Verhoog";
           }
           repaint();
    }
}

    abstract class Ballon {
    //Attributen
    int diameter;
    int xCoord;
    int yCoord;

    //Constructions
    Ballon(int initDiameter, int initXCoord, int initYCoord){
               diameter=initDiameter;
               xCoord=initXCoord;
               yCoord=initYCoord;
    }
    Ballon(int initXCoord, int initYCoord){
               diameter=10;
               xCoord=initXCoord;
               yCoord=initYCoord;
    }

    //methoden
    public void actionPerformed(){
    }
    public void naarRechts(){
         xCoord += 10;
    }
    public void naarRechts(int afstand){
         xCoord += afstand;
    }
    public void naarLinks(){
         xCoord -= 10;
    }
    public void naarLinks(int afstand){
         xCoord -= afstand;
    }
    public void naarBoven(){
         yCoord += 10;
    }
    public void naarBoven(int afstand){
         yCoord += afstand;
    }
    public void naarBeneden(){
         yCoord -= 10;
    }
    public void naarBeneden(int afstand){
         yCoord -= afstand;
    }
    public void groeien(){
          diameter += 10;
    }
    public void krimpen(){
          diameter -=10;
    }
}
class Groeien extends Ballon {

}

De fout die ik altijd krijg is connot resolve symbol bij:
Ballon vergroot = new Ballon();
en bij:
class Groeien extends Ballon {

}

Mvg f00raap

ge kunt een abstracte klasse in java gewoon niet instantieren.

.Acku.

Legacy Member
Om toch even duidelijk te maken waarom dat zo is:

Abstracte klassen beschrijven zaken die hun subklassen gaan implementeren, maar hebben die niet zelf. Je kan dus enkel een implementerende subklasse ervan instantieren, want het gedrag van een abstracte klasse zelf is onbestaand.
De reden waarom je zulke klassen is maakt is eenvoudig: sommige zaken zijn voor elke subclass hetzelfde, en die implementeer je daar alvast. Zodoende moeten uw subklassen niet dezelfde code opnieuw gaan bevatten.
Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.
Terug
Bovenaan