2010-06-30 17 views
6

Ho creato l'istanza della classe base nella classe derivata e ho provato ad accedere ai membri protetti.java - membri protetti acceduti nella classe derivata utilizzando l'istanza della classe base

Posso accedere direttamente ai membri protetti in una classe derivata senza creare un'istanza della classe base.

Classe base:

package com.core; 

public class MyCollection { 

     protected Integer intg; 
} 

Una classe derivata nella stessa confezione -

package com.core; 

public class MyCollection3 extends MyCollection { 

public void test(){ 

    MyCollection mc = new MyCollection(); 
    mc.intg=1; // Works 
} 
}

Una classe derivata in un pacchetto differente -

package secondary; 

import com.core.MyCollection; 

public class MyCollection2 extends MyCollection{ 

public void test(){ 
    MyCollection mc = new MyCollection(); 
    mc.intg = 1; //!!! compile time error - change visibility of "intg" to protected 
} 
} 

Come è possibile accedere un membro protetto di una classe base in una classe derivata utilizzando l'istanza della classe base quando la classe derivata è anch'essa in s pacchetto ame ma non quando la classe derivata è in un pacchetto diverso?

Se contrassegno membro protetto come "statico", posso accedere al membro protetto della classe base utilizzando l'istanza della classe base in una classe derivata che risiede in un pacchetto diverso.

+0

possibile duplicato del [Java Protected Access non funziona] (http://stackoverflow.com/questions/332920/java-protected-access-not-working) --- In realtà questo è l'errore sbagliato! Scusate! Questo è sicuramente un dupe però. – polygenelubricants

+0

non ti preoccupare, il tuo IDE non farà alcuna differenza alla domanda in quanto riguarda la semantica del linguaggio Java stesso. –

+0

possibile duplicato di [perché non posso accedere al metodo java protetto anche se ho pensato di estendere la classe?] (Http://stackoverflow.com/questions/1622219/why-cant-i-access-protected-java-method -even-thought-ive-extended-the-class) – starblue

risposta

10

Hai ragione che non puoi farlo. Il motivo per cui non è possibile accedere al campo è che non si trova nello stesso pacchetto della classe, , né si sta accedendo a un membro ereditato della stessa classe.

L'ultimo punto è la critica uno - se avessi scritto

MyCollection2 mc = new MyCollection2(); 
mc.intg = 1; 

allora questo potrebbe funzionare, come si modifica un membro protetto della proprio classe (che è presente in quella classe attraverso l'ereditarietà). Tuttavia, nel tuo caso stai provando a cambiare un membro protetto di una classe diversa in un altro pacchetto. Quindi non dovrebbe sorprendere che ti venga negato l'accesso.

+0

Questa spiegazione è davvero facile da capire. Ho dato un'occhiata alle specifiche del linguaggio Java e la loro elaborazione è andata oltre la mia testa !!! – Tarun

+0

@Tarun - se una risposta ha funzionato per te, contrassegnalo come accettato (spunta sotto il contatore dei voti) – Bozho

+0

Non conoscevo questa funzione. Lo segnerei come risposta ora. – Tarun

0

In base alla regola di accessibilità del membro di Java non è possibile accedere a un membro protetto di una classe senza estenderlo.

È possibile provare quanto segue.

package secondary; 

import com.core.MyCollection; 

public class MyCollection2 extends MyCollection{ 

public void test(){ 
    intg = 1; 
} 
} 

Invece di creare la nuova istanza, provare ad assegnare il valore. Funzionerà.

+0

Accetto con il tuo ragionamento – Tarun

3

Il Java tutorial dice:

Il modificatore protetta specifica che il membro è accessibile solo all'interno del proprio pacchetto (come con il pacchetto-privato) e, inoltre, da una sottoclasse della sua classe in un altro pacchetto .

E nel tuo caso, stai accedendo alla variabile in un altro oggetto. Per coincidenza, ha una classe uguale a quella corrente, ma i controlli di visibilità non lo controllerebbero.

Così, la seconda volta si è negato l'accesso, in quanto ci si trova in un pacchetto differente, e la prima volta si è dato l'accesso perché siete nella stessa confezione (e non perché si tratta di una sottoclasse)

+0

"la prima volta che ti viene dato l'accesso perché ti trovi nello stesso pacchetto (e non perché è una sottoclasse)" Questo lo rende chiaro per me. Grazie. – Tarun

1

In Insomma, non è davvero possibile. Sembra che dovresti riconsiderare il tuo design.

Tuttavia, c'è un problema, se sei sicuro che sia quello che vuoi fare. È possibile aggiungere un protetto metodo-MyCollection che prende un'istanza e imposta il valore di intg a vostro nome:

package com.core; 

public class MyCollection { 

    protected Integer intg; 

    protected void setIntg(MyCollection collection, Integer newIntg) { 
     collection.intg = newIntg; 
    } 
}

Ora i vostri sottoclassi possono accedere a questo metodo:

package secondary; 

import com.core.MyCollection; 

public class MyCollection2 extends MyCollection{ 

    public void test(){ 
     MyCollection mc = new MyCollection(); 
     setIntg(mc, 1); 
    } 
}

Ma si ricorda che questo è uno molto strano modo di farlo. Suggerirei nuovamente che il tuo progetto debba essere ripensato prima di percorrere questa rotta.

+0

Ho capito il tuo punto. Il modo più semplice per me sarebbe stato di accedere direttamente al membro protetto rispetto all'istanziazione della classe base e all'accesso in un pacchetto diverso. L'ho fatto "erroneamente" mentre giocavo con java (non ho detto di essere un tester di manaul :-)) e poi nessuno dei miei dev membri è stato in grado di fornirmi una risposta concepibile. Quindi l'ho postato qui. – Tarun

0

Non è possibile accedere a una variabile protetta in una classe derivata (che si trova in un pacchetto diverso) se si accede utilizzando un nuovo oggetto di classe MyCollection. puoi semplicemente scrivere intg = 1; direttamente senza fare (nuovo MyCollection) simili:

package secondary; 
import com.core.MyCollection;  
public class MyCollection2 extends MyCollection{ 

public void test(){ 

    intg = 1; 

} 
} 
3

Se un membro della classe è protected poi ci sono 2 casi:

  1. Se sottoclasse è nella stessa confezione
  2. Se sottoclasse è in package diverso

I. Stesso pacco:
- Può accedere tramite l'ereditarietà
- Può accedere creando un'istanza della classe genitore
II. pacchetto diverso:
- Can solo accesso attraverso l'ereditarietà

Vedere la tabella sottostante per tutti i casi di utilizzo:

enter image description here

Problemi correlati