web-dev-qa-db-fra.com

Appel de superclasse à partir d'un constructeur de sous-classe dans Java

J'essaie de créer un constructeur qui prend un champ comme paramètre, puis le place dans un champ qui est stocké dans une superclasse. Voici le code que j'utilise

public crisps(String flavour, int quantity) {
    this.flavour = super.getFlavour();
    this.quantity = quantity;
}

Dans la superclasse, j'ai initialisé le champ avec

private String flavour;

et j'ai une méthode d'accesseur

public String getFlavour() {
    return flavour;
}

Je reçois une erreur "la saveur a un accès privé dans la superclasse", mais je crois que cela ne devrait pas avoir d'importance car j'appelle la méthode d'accesseur qui la renvoie au champ?

12
user215732

Ce que vous devez faire:

Ajoutez un constructeur à votre super classe:

public Superclass {
    public SuperClass(String flavour) {
       // super class constructor
       this.flavour = flavour;
    }
}

Dans la classe Crisps:

public Crisps(String flavour, int quantity) {
    super(flavour); // send flavour to the super class constructor
    this.quantity = quantity;
}

Commentaires

Quelques commentaires à votre question:

"Dans la superclasse, j'ai initialisé le champ avec"

private String flavour;

Ce n'est pas une initialisation, c'est une déclaration. Une initialisation est lorsque vous définissez une valeur.

"Je reçois une erreur" la saveur a un accès privé dans la superclasse "mais je crois que cela ne devrait pas avoir d'importance car j'appelle la méthode d'accesseur qui la renvoie sur le terrain?"

Lorsque vous appelez un accesseur (aka getter), c'est ok - cela dépend de la visibilité du getter. Le problème dans votre code est le suivant:

this.flavour = 

parce que la saveur n'est pas un champ déclaré sur la classe Crisps, mais sur la classe souper, donc vous ne pouvez pas faire un accès direct comme ça. vous devriez utiliser ma suggestion ou déclarer un setter sur le super class:

public void setFlavour(String flavour) {
    this.flavour = flavour;
}

Ensuite, vous pouvez l'utiliser sur la classe enfant:

public Crisps(String flavour, int quantity) {
    this.quantity = quantity;
    super.setFlavour(flavour);
}
20
lpinto.eu
public crisps(String flavour, int quantity)
{
    super(flavour);
    this.quantity = quantity;
}

Cela devrait fonctionner comme voir la documentation

2
HansB

make

    private String flavour;

public, sinon vos sous-classes n'auront pas accès à cette chaîne. Votre superclasse ne connaît l'existence d'aucune sous-classe. Selon Java, "private" rend toute variable et méthode disponibles dans cette classe, où la variable ou la méthode privée a été déclarée, aucune classe n'y a accès, même les sous-classes. Une fois que vous modificateur d'accès, vous n'obtiendrez aucune erreur.

2
Aida Isay

flavour est privé. Bien que vous le lisiez à partir de la méthode publique, vous l'assignez à un champ privé et vous ne l'avez probablement pas déclaré dans cette classe.

Vous pouvez définir la saveur sur protected dans la classe parente ou définir un setter pour celle-ci

En fin de compte, votre code n'a pas vraiment de sens. Même s'il compilait, ce serait plus ou moins: flavour = flavour. Vous devriez peut-être repenser un peu ce que vous essayez de faire

Je pense que vous pourriez avoir besoin d'une meilleure compréhension de Java et programmation orientée objet.

http://docs.Oracle.com/javase/tutorial/Java/concepts/

Vous devriez commencer ici.

2
Cruncher