2013-10-11 13 views
9

Sto provando a creare un costruttore che prende un campo come parametro, quindi lo inserisce in un campo che è memorizzato in una superclasse. Ecco il codice che sto usandoChiamare la superclasse da un costruttore sottoclasse in Java

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

nella superclasse ho inizializzato il campo con

private String flavour; 

e ho un metodo di accesso

public String getFlavour() { 
    return flavour; 
} 

sto ottenendo un errore "flavor ha accesso privato nella superclasse ", ma credo che questo non dovrebbe avere importanza in quanto sto chiamando il metodo accessor che lo restituisce al campo?

+0

Euh, quello che hai dovrebbe funzionare bene. Sei sicuro di mostrarci il vero codice? –

+1

Invia un [SSCCE] (http://sscce.org) per replicare il tuo problema. –

+0

È 'title' dichiarato in' crisps' o nella classe genitore? –

risposta

15

cosa si dovrebbe fare:

Aggiungere un costruttore per la classe super:

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

Nella classe di patatine fritte:

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

 

Co mments

Alcuni commenti alla tua domanda:

"nella superclasse ho inizializzato il campo con"

private String flavour; 

Questo non è un di inizializzazione, si tratta di una dichiarazione. Un'inizializzazione è quando si imposta un valore.

"Ricevo un errore" flavor ha accesso privato nella superclasse "ma credo che questo non dovrebbe importare poiché sto chiamando il metodo accessor che lo restituisce al campo?"

Quando si chiama un accessor (ovvero getter), è ok, dipende dalla visibilità getter. Il problema in voi codice è la:

this.flavour = 

perché il sapore non è un campo dichiarato di classe patatine, ma sulla classe cena, quindi non è possibile fare un accesso diretto del genere. si consiglia di utilizzare il mio suggerimento o dichiarare un setter sulla classe super-:

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

Quindi è possibile utilizzare sulla classe bambino:

public Crisps(String flavour, int quantity) { 
    this.quantity = quantity; 
    setFlavour(flavour); 
} 
+0

@ ipinto.eu mentre la tua risposta è corretta e così è la tua soluzione, la tua ultima soluzione alternativa nella tua risposta (usando setter di superclasse) viola la regola dell'ereditarietà, suppongo, dato che darebbe "[Overridable method call in constructor ] (https://stackoverflow.com/questions/3404301/whats-wrong-with-overridable-method-calls-in-constructors) "problema. Quindi, l'ultima soluzione alternativa non è una soluzione reale, ma porterebbe bug all'interno del codice. Penso che * super.setFlavour (flavor) * dovrebbe funzionare. –

+0

Capisco e sono d'accordo; Devo dire che l'esempio era per il gusto di discutere. Mi piace il tuo suggerimento di chiamarlo usando super, Altre opzioni (e diversa filosofia) è quello di rendere definitivi i tuoi setter (non è possibile scavalcare). –

1

flavour è privato. Sebbene tu lo stia leggendo dal metodo pubblico, lo stai assegnando a un campo privato e probabilmente non lo hai dichiarato in questa classe.

È possibile impostare sapore protected nella classe padre o definire un setter per esso

In definitiva il codice non davvero senso però. Anche se fosse compilato, sarebbe più o meno: flavour = flavour. Forse dovresti ripensare a quello che stai cercando di fare un po '

Penso che potresti aver bisogno di una stretta comprensione su Java e sulla programmazione orientata agli oggetti.

http://docs.oracle.com/javase/tutorial/java/concepts/

Si dovrebbe cominciare da qui.

+0

ok, c'è comunque da fare con le chiamate al metodo pubblico getFlavour? – user215732

+0

@ user215732 'getFlavour' fa proprio questo. Ottiene 'sapore'. Non puoi usare questo per assegnare un valore al sapore. Se restituisce un oggetto mutabile, è possibile modificare il sapore reale, ma in questo caso le stringhe sono immutabili. – Cruncher

+1

@ user215732 Il costruttore 'crisps' ha un parametro' flavour' ma non si sta facendo nulla con esso, poiché il codice è attualmente scritto. – ajb

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

Questo dovrebbe funzionare come see Docs

1

marca

private String flavour; 

pubblico, altrimenti le sottoclassi non avranno accesso a questa stringa. La tua superclasse non sa dell'esistenza di alcuna sottoclasse. Secondo la documentazione di Java, "privato" rende qualsiasi variabile e metodo disponibile all'interno di quella classe, dove è stata dichiarata la variabile privata o il metodo, nessuna classe ha accesso ad essa, nemmeno sottoclassi. Una volta azzardato il modificatore di accesso, non si verificheranno errori.