1
votes

L'initialisation du tableau et du constructeur ne fonctionne pas

Je veux appeler le constructeur ConcreteSubject dans la classe ConcreteSubject à main. J'essaie de créer un tableau avec un constructeur qui accepte en tant que paramètres pour initialiser le tableau. Je ne suis donc pas sûr de ce qui manque / ne va pas.

public class ConcreteSubject extends AbstractSubject {
    public int arySize;

    private AbstractSpy[] spies;

    public ConcreteSubject(int a) {
        arySize = a;
        spies = new AbstractSpy[a];
    }

    @Override
    void notifySpies() {

    }

    @Override
    public void addSpy(AbstractSpy spy) {

    }
}

public class TestSpies {
    public static void main(String[] args) {
        // this is where there is something wrong as it whats another constructor created.
        ConcreteSubject cs = new ConcreteSubject();
        AbstractSpy spy = new ConcreteSpy();
        AbstractSpy[] spies = new AbstractSpy[10];
        cs.addSpy(spy);
    }
}


1 commentaires

Vous avez donné à votre classe un constructeur qui prend un int a comme paramètre et pour cela, vous devez également appeler le constructeur avec ce paramètre.


5 Réponses :


2
votes

La classe ConcreteSubject n'a pas de constructeur par défaut. Il n'y a qu'un seul constructeur avec le paramètre int:

int x = ...
new ConcreteSubject(x);

Et vous devez passer le paramètre int à l'appel de ce constructeur. Ainsi, l'appel devrait ressembler à:

public ConcreteSubject(int a) {
//    ...
}


0 commentaires

3
votes

Vous avez défini votre constructeur comme ci-dessous, avec un paramètre int:

ConcreteSubject cs = new ConcreteSubject(5); 

Ce qui signifie que lorsque vous l'appelez, vous devez passer un paramètre int, par exemple:

public ConcreteSubject(int a) {
…
}


0 commentaires

1
votes

Il existe deux façons de résoudre ce problème:

A. Créez un constructeur non paramétré dans la classe ConcreteSubject

public ConcreteSubject() {
    //Initialize the variables with default values
}

B. Ou, utilisez ConcreteSubject cs = new ConcreteSubject (10); au lieu de ConcreteSubject cs = new ConcreteSubject (); dans la méthode main . P >


0 commentaires

4
votes

lorsque vous créez un constructeur pour votre classe, java ne vous donne pas le constructeur par défaut. et vous ae initialiser votre objet avec ConcreteSubject cs = new ConcreteSubject ();

il y a 2 solutions pour initialiser le tableau:

  1. créer un constructeur par défaut dans votre classe ConcreteSubject

    public ConcreteSubject () {

    cs.arySize= x //whatever value you want`
    cs.spies = new new AbstractSpy[a];
    

puis intiaise array `

} 
  1. ou vous devez initialiser votre objet comme ci-dessous:

    ConcreteSubject cs = new ConcreteSubject (x); // quelle que soit la valeur que vous voulez


0 commentaires

1
votes

Si vous ne créez pas de constructeur, java créera automatiquement un constructeur par défaut. Mais si vous en créez un qui n'est pas par défaut, comme celui que vous avez créé avec le paramètre int, alors vous devrez créer un constructeur par défaut par vous-même (si vous en avez besoin) car java n'en fera pas un par défaut dans ce cas.


0 commentaires