Domanda

Diciamo che abbiamo una classe foo che ha una variabile di istanza privata bar .

Ora diamo un'altra classe, baz , che estende foo . I metodi non statici in baz possono accedere alla foo variabile bar se non è stato definito alcun metodo di accesso in foo ?

Sto lavorando in Java, comunque.

È stato utile?

Soluzione

No, non secondo il linguaggio java specifica, terza edizione :

  

6.6.8 Esempio: campi, metodi e costruttori privati ??

     

Un privato   membro della classe o costruttore è   accessibile solo all'interno del corpo del   classe di alto livello (§7.6) che racchiude   la dichiarazione del membro o   costruttore. Non è ereditato da   sottoclassi.

Ma indipendentemente da questa restrizione linguistica, puoi accedi ai campi privati ??attraverso la riflessione :

Field privateStringField = 
   MyClass.class.getDeclaredField("privateString");
privateStringField.setAccessible(true);

String fieldValue = (String) privateStringField.get(privateObject);
System.out.println("fieldValue = " + fieldValue);

Altri suggerimenti

No, per questo dovresti usare protected.

Per domande come questa, dove si trova una tabella sul sito Web qui: http://java.sun.com/docs/books/tutorial/java/javaOO/accesscontrol.html

Fondamentalmente vuoi che la variabile pubblica o protetta sia dichiarata in foo poiché queste sono le variabili che le sottoclassi ereditano dal loro genitore e quindi sono viste in baz.

Le classi secondarie non possono accedere ai membri privati ??(che è l'intero punto del controllo di accesso privato).

... se non esiste un metodo di accesso definito in pippo?

Hai bisogno di accessori. Inoltre, prenditi cura dell'eredità, che var dovrebbe davvero essere genitore? Ricorda il segno di spunta IS-A ..

Non è possibile accedere alle variabili private nelle classi discendenti. Normalmente vorresti utilizzare " protetto " o "pacchetto" (predefinito) livello di accesso per questo. Tuttavia, se vuoi essere davvero complicato, puoi ricorrere all'uso di reflection e AccessibleObject per farlo. Non consiglierei di farlo per il codice di produzione a meno che tu non sia davvero in difficoltà; per i test, ecc., va bene.

Per utilizzare una variabile privata di una superclasse in una sottoclasse, è richiesto un metodo di accesso. Altrimenti usa il modificatore protetto anziché privato.

Le variabili private di una classe hanno invariabilmente un ambito all'interno di quella classe. Se deve essere condiviso tra le sottoclassi, deve essere dichiarato "protetto"

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top