2014-12-17 12 views
5

È passato un po 'di tempo da quando ho lavorato su qualsiasi cosa in Java, e ho davvero un'esperienza molto limitata nel farne qualcosa, per la maggior parte scrivo in linguaggi specifici di livello superiore, linguaggi di scripting e tipo.Modifica dei valori delle variabili nelle sottoclassi?

Suppongo di non capire il concetto alla base dell'assegnazione del valore predefinito dei membri di una classe.

// parent 
public class A { 
    protected int value = 0; 
    public void print() { 
     System.out.println(value); 
    } 
} 

// child class 
public class B extends A { 
    int value = 1; 
} 

Per farla breve, la creazione di un'istanza di B e chiamando print() stampa il valore originale di "valore" impostato in A.

suppongo piuttosto che essere un qualche tipo di identificatore generale " una variabile denominata 'valore' di proprietà di questo oggetto, "la funzione definita su A ha un contesto completamente diverso per" valore "rispetto a B.

Quale altro metodo è lì per organizzare le varianti comuni di una certa classe ma creare un figlio di detta classe? Una specie di oggetto fabbrica? Non sembra che le interfacce siano la risposta perché allora devo ridefinire ogni singolo aspetto della classe, quindi non ho guadagnato nulla nel farlo.

Qualsiasi aiuto sarebbe molto apprezzato, grazie.

+2

Dichiarare 'value' in' B' si nasconde il 'value' in' A'.È necessario creare un costruttore per 'B' e impostare' value = 1' lì. – azurefrog

+3

Vedere [nascondere i campi] (http://docs.oracle.com/javase/tutorial/java/IandI/hidevariables.html) per ulteriori informazioni. – azurefrog

+0

Il nascondiglio del campo non è il colpevole di questa domanda. Con il campo nascosto, B.value nasconderebbe A.valore. Invece, l'OP sta ottenendo A.value e si aspetta B.valore. –

risposta

6

I campi di sottoclassi non sovrascrivono i campi della superclasse.

È possibile impostare un valore predefinito tramite i costruttori, come illustrato di seguito.

// parent 
public class A { 
    private int value = 0; 
    public A(int initialValue) { 
     value = initialValue; 
    } 

    public void print() { 
     System.out.println(value); 
    } 
} 

// child class 
public class B extends A { 
    public B() { 
     super(1); 
    } 
} 

Inoltre, nella maggior parte dei casi, la vostra vita sarà più facile se si evita di campi protetti.

I campi protetti aprono i dati per l'accesso diretto e le modifiche da parte di altre classi, alcune delle quali potrebbero non essere controllate. Lo scarso incapsulamento può consentire bug e inibire la modifica. Come suggerito nello Java tutorials on access control:

"Utilizzare il livello di accesso più restrittivo che abbia senso per un determinato membro. Utilizzare privato a meno che non si abbia una buona ragione per non farlo."

+0

"Nella maggior parte dei casi, la vita sarà più facile se si evitano i campi protetti." Questo può essere vero, ma probabilmente merita più spiegazioni. – dnault

+0

@dnault - Aggiunta spiegazione. Grazie per l'idea. –

+0

Questa è praticamente la conclusione alla quale sono arrivato dopo alcuni minuti di giocherellare con esso. Non mi piace l'idea di dover impostare i valori durante la creazione dell'oggetto dato che sono così abituato a ridefinire i membri in sottoclassi, semplicemente sovrascrivendo i valori, ma questo sembra essere quello che richiede il paradigma object oriented (penso che C++ non funzioni Ti lascio ignorare?). Grazie per l'input. – milkmanjack

4

@ user2038045 - buona domanda.

La fonte della vostra confusione è che in Java, una sottoclasse può sovrascrivere metodi ... ma non può ignorare variabili membro.

Se la vostra classe B ha il proprio metodo "print()" - vedrete il comportamento che vi aspettavate. B.print() sarebbe override A.print().

Se la tua classe B aveva un altro metodo che ha accesso al "valore", vedresti nuovamente il comportamento che ti aspettavi. B.valore nasconde A.value e B.someOtherMethod() accederebbero a B.value.

Ma nel tuo caso, hai chiamato A.print() ... che accede ad A.value.

Qui ci sono ulteriori dettagli:

Is there a way to override class variables in Java?

+0

Grazie per aver chiarito! – milkmanjack

Problemi correlati