2015-10-18 20 views
5

Ho appreso quanto segue dal libro Core Java, Volume I - Fondamenti (ottava edizione)> Capitolo 5: Ereditarietà> sezione "Accesso protetto" (Pagina 205).Un oggetto di una sottoclasse può accedere a un campo protetto di un altro oggetto di un'altra sottoclasse?

Ci sono momenti, tuttavia, quando si desidera limitare un metodo per sottoclassi solo o, meno frequentemente, per consentire metodi delle sottoclassi di accedere un campo della superclasse. In tal caso, si dichiara una funzione di classe come protetta . Ad esempio, se il dipendente superclasse dichiara il campo rentday come protetto anziché privato, i metodi Manager possono accedervi direttamente.

Tuttavia, i metodi di classe Manager possono dare un'occhiata all'interno del campo hireDay solo degli oggetti Manager, non di altri oggetti Employee. Questa restrizione viene effettuata in modo che non è possibile abusare del meccanismo protetto e creare sottoclassi solo per accedere ai campi protetti.

Ho scritto il seguente codice per testarlo.

class Employee 
{ 
    protected String name; 

    public Employee(String name) { 
     this.name = name; 
    } 
} 

class Manager extends Employee 
{ 
    public Manager(String name) { 
     super(name); 
    } 

    public void peekName(Employee e) { 
     System.out.println("name: " + e.name); 
    } 
} 

class Executive extends Employee 
{ 
    public Executive(String name) { 
     super(name); 
    } 
} 

public class TestProtectedAccess 
{ 
    public static void main(String[] args) { 
     Employee e = new Employee("Alice Employee"); 
     Manager m = new Manager("Bob Manager"); 
     Executive ex = new Executive("Charles Executive"); 

     // Manager object accessing protected name of Employee object 
     m.peekName(e); 

     // Manager object accessing protected name of Executive object 
     m.peekName(ex); 
    } 
} 

L'output del codice è:

$ java TestProtectedAccess 
name: Alice Employee 
name: Charles Executive 

L'oggetto Manager m è in grado di accedere campo protetto name di altri collaboratori oggetti e e ex. Questo sembra contraddire quello che ho citato sopra dal libro, specialmente la parte che ho evidenziato in grassetto.

Qualcuno può spiegarmi se il libro è sbagliato o la mia comprensione è sbagliata? Se la mia comprensione è sbagliata, puoi suggerire un esempio migliore per capire cosa significa il libro?

risposta

2

Poiché le classi sono tutte nello stesso pacchetto, protetto è lo stesso del pubblico.

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

https://docs.oracle.com/javase/tutorial/java/javaOO/accesscontrol.html

+0

Sì si può sicuramente farlo. –