2012-05-08 6 views
6

Do subclasses inherit private fields?Do sottoclassi Eredita variabili di istanza privato da superclassi

Questa domanda affronta lo stesso problema, ma io non riesco a capire come questo soddisfa le (apparentemente) situazioni contraddittorie sotto.

http://docs.oracle.com/javase/tutorial/java/IandI/subclasses.html

dice che "Una sottoclasse non eredita i membri privati ​​della sua classe genitore."

Ciò significa che non eredita le variabili di istanza private né i metodi privati, giusto?

Tuttavia, come funziona se eredita un metodo di accesso pubblico dal suo genitore? Restituisce una variabile di istanza che non conosce esiste?

Inoltre, il mio libro di informatica (AP Computer Science A di Baron) ha la risposta corretta a una domanda che dice che "La sottoclasse eredita tutte le variabili di istanza private e i metodi di accesso pubblico da (Superclasse)."

Non è questo in contrazione al tutorial di oracle?

Grazie per il vostro aiuto

risposta

0

Anche i membri privati ​​sono ereditati. Per verificare ciò, è possibile effettuare le seguenti operazioni nella superclasse:

//... 
private String myText = "I'm in the superclass"; 

private void setMyText(String myTextValue) 
{ 
    this.myText = myTextValue; 
} 

public void setMyTextPublic(String myTextValue) 
{ 
    setMyText(myTextValue); 
} 

public String getMyText() 
{ 
    return myText; 
} 
//... 

Creare un metodo nella classe ereditata:

//... 
public void setMyTextInTheSuperClass(String myTextValue) 
{ 
    System.out.println(getMyText()); 
    setMyTextPublic(myTextValue); 
    System.out.println(getMyText()); 
} 

public void setConstantValueToMyText() 
{ 
    setMyTextInTheSuperClass("I am in the child class"); 
} 
//... 

E chiamare setConstantValueToMyText da qualche parte.

+1

Sono tutto per schemi di denominazione metasintattici, ma a un certo punto può diventare contorto. Probabilmente dovresti rinominare 'foobar' in' setFoo' e 'barfoo' in' getFoo'. – Jeffrey

+0

@Jeffrey, hai assolutamente ragione nel segnalare il problema del naming, tuttavia i nomi nel codice di test non avevano alcun senso apposta per mostrare l'op, che probabilmente è un novizio di cui stiamo parlando qualsiasi membro e qualsiasi funzione, non solo impostando o ottenendo valori. Tuttavia, hai ragione quando dici di questi nomi che "non provarlo a casa, i tuoi nomi dovrebbero avere un senso". –

+0

Ho pensato che la maggior parte delle persone avrebbe avuto il buon senso di non nominare i loro metodi come quello nel codice reale, ma quando ho cercato di seguire il tuo esempio e sono stato leggermente confuso. Posso solo immaginare quanto sarebbe confuso per un principiante. – Jeffrey

2

"non eredita" qui significa che non è possibile accedervi. Esiste ancora, semplicemente non in alcun modo con cui è possibile interagire (tranne che attraverso la chiamata di metodi non privati ​​della superclasse).

The accepted answer nella domanda a cui ci si riferisce. C'è qualcosa di particolare in questa spiegazione che non è chiaro?

+0

Ciò che non è chiaro è perché il mio libro di testo dice che è la risposta a questa domanda. – Ian

+1

Significa solo qualcosa di leggermente diverso da "eredita". – trutheality

+0

Questo ha senso, grazie mille. – Ian

10

L'accessorio funzionerà correttamente. Ricorda che l'accessorio si trova nel "contesto" della superclasse e quindi l'accessore sarà in grado di vedere il membro nascosto dalle sottoclassi.

Per quanto riguarda il libro di testo, dipende dal vostro punto di vista. La sottoclasse eredita i membri privati ​​nel senso che sono effettivamente presenti all'interno delle istanze della sottoclasse (quindi occupano memoria, ecc.), Ma la sottoclasse non sarà in grado di accedervi direttamente.

+3

+1 Sì, la tua risposta può essere enfatizzata da un esempio: gli umani hanno ereditato (se crediamo nella teoria dell'evoluzione) una sorta di coda dalle scimmie (una parte dell'osso nella parte inferiore) ma non possono scodinzolare. Possono solo guardare le scimmie mentre si agitano il loro racconto, o dare loro una banana per incoraggiarli a scodinzolare. –

+0

E in che modo questo si riferisce all'ereditarietà dei metodi privati? Sono ereditati ma nascosti? Non puoi usare (oggetto di sottoclasse). (Metodo privato di superclassi) giusto? modifica: Lajos è un ottimo esempio. – Ian

+1

È collegato al fatto che la coda è un membro privato delle scimmie, che scodinzola è un metodo privato, perché solo le scimmie hanno la coda e solo loro possono scodinzolare. Tuttavia, ci sono due metodi: il primo è il metodo pubblico di guardare la coda delle scimmie, che è definito nella classe base (Monkey) e può essere accessibile anche agli umani, che sono anche in grado di vedere le scimmie scodinzolare, mentre il secondo è il metodo privato di dare la banana alle scimmie, che è accessibile solo per gli umani, perché le scimmie sono egoiste e non danno la banana l'una all'altra. –

1

Certo, quando si crea un oggetto di una classe B che eredita da una classe A se la classe A ha elementi privati, secondo le regole di accesso in Java, è non può avere accesso li, ma questi elementi fare esistono nella memoria privata, anche come riferimenti null se fossero oggetti nulli.

In Il linguaggio Java Specification, si può leggere:

Una classe eredita dalla propria superclasse diretta e superinterfacce diretti tutti i campi non privati ​​della superclasse e superinterfacce che sono entrambi accessibili al codice la classe e non nascosta da una dichiarazione nella classe.

Un campo private di una superclasse potrebbe essere accessibile ad una sottoclasse - per esempio, se entrambe le classi sono membri della stessa classe. Tuttavia, un campo private non viene mai ereditato da una sottoclasse.

4

Pensateci come una cipolla. Ogni livello di gerarchia è uno strato all'interno della cipolla. Ad esempio, se la classe C estende Classe B, che si estende classe A poi un oggetto della classe C sarà simile:

Object of Class C

 ------------------------------------------------------------- 
     |               | 
     |     C and it's members      | 
     |               | 
     | ------------------------------------------------  | 
     | |            |  | 
     | |    B and it's members    |  | 
     | | ------------------------------------  |  |            
     | | |   A and it's members  |  |  | 
     | | |         |  |  | 
     | | ------------------------------------  |  |         
     | ------------------------------------------------  | 
     |               | 
     -------------------------------------------------------------    

Quindi, un oggetto di classe C non hanno membri di B e di A . Ma non può accedere ai membri privati ​​di B e di A.

si può comunque accedere ai membri pubblici e protetti di B e di A.

Quindi una funzione di accesso pubblica di B o di a dovrebbe permettere che questo oggetto di classe C a accedere a una variabile di istanza privata di la classe B o la classe A "parte" dell'oggetto.

1

Se la sottoclasse è nello stesso pacchetto eredita anche i membri privati, altrimenti eredita solo membri pubblici e protetti!

Problemi correlati