Modificatori

di il
7 risposte

Modificatori

Ciao a tutti sono nuovo del forum e sebbene programmi da qualche tempo ho deciso di "imparare" bene a programmare. Ho già sviluppato applicazioni per Android che funzionano ma non ho mai fatto molta attenzione sia alla leggibilità dei codici (e quindi alla ridondanza), sia all'uso della memoria. La mia domanda è questa :
quando definisco una variabile nella classe principale (main) che poi userò in classi che vengono chiamate da questa, se uso un modificatore public o protected nella classe main, la visibilità e usabilità della variabile si "estende" alle altre classi del package? Grazie, Ricky

7 Risposte

  • Re: Modificatori

    Ricky1966 ha scritto:


    se uso un modificatore public o protected nella classe main, la visibilità e usabilità della variabile si "estende" alle altre classi del package?
    Una classe o un membro "public" è visibile da qualunque altra classe, in qualunque package (lo stesso o uno differente).

    Un membro "protected" è visibile: a) da qualunque classe nello stesso package e b) da sotto classi in package differenti ma SOLO per effetto della ereditarietà, cioè solo perché una classe eredita il membro protected.

    P.S. un classe (tipo in generale: interface, enum, annotation) "top level" non può essere protected e nemmeno private.
  • Re: Modificatori

    I membri protected EREDITATI diventano poi privati a quelle classi, così che altre classi che si trovano nello stesso package non potranno acccedervi.
  • Re: Modificatori

    mariojav ha scritto:


    I membri protected EREDITATI diventano poi privati a quelle classi, così che altre classi che si trovano nello stesso package non potranno acccedervi.
    Non è che diventano "privati". Sono appunto, come dicevo prima, visibili alla sotto classe solo per l'effetto particolare della ereditarietà. Ma non diventano privati ... una ulteriore sotto classe in un altro package ancora può continuare a vedere il membro, sempre per lo stesso effetto.

    Una classe A nel package x ha un protected int val;
    Una classe B nel package y che estende A PUÒ accedere a val.
    Una classe B2 nel package y (che non è in relazione con A o con B) NON può accedere a val, neanche avendo un reference della classe A e nemmeno avendo un reference di B.
    Una classe C nel package z che estende B PUÒ accedere a val (quel val di A).


    P.S. le classi che ho citato intendiamole "public" per semplicità.
  • Re: Modificatori

    Si mi riferivo all'effetto della mancata visibilità, è il caso che tu hai citato:
    "Una classe B2 nel package y (che non è in relazione con A o con B) NON può accedere a val, neanche avendo un reference della classe A e nemmeno avendo un reference di B."

    tutto ciò che è fuori a B (in y), tranne le sottoclassi, non possono accedervi, per cui è "simile" al private, l'ho inteso come effetto ("NON può accedere"), non so che termine alternativo usare... cmq è corretto. Grazie per la puntualizzazione.
  • Re: Modificatori

    Grazie per le risposte. Il Java lo usa per app Android perciò faccio un esempio con quello e spero sia "comprensibile". Allora se nella MainActivity iinizializzo per eesempio una HashMap con protected la posso richiamare nelle altre Activity che sono dentro il package che poi è l'insieme delle classi dentro a com.ricky.application, giusto?
  • Re: Modificatori

    Ricky1966 ha scritto:


    Allora se nella MainActivity iinizializzo per eesempio una HashMap con protected la posso richiamare nelle altre Activity che sono dentro il package che poi è l'insieme delle classi dentro a com.ricky.application, giusto?
    Ma la questione non è tanto tecnica del livello di accesso .... ma concettuale, di "design". Perché da altre classi dovresti accedere direttamente ad un campo di un oggetto di una certa classe?
  • Re: Modificatori

    Perché per esempio inizializzo solo una volta una variabile (aattribuito?) e all'occorrenza lo riuso per esempio che sò la data o la famosa HashMap di cui sopra che uso per una List (sempre di Android parlo) e poi per fare il PDF nella classe che userà la HashMap.
Devi accedere o registrarti per scrivere nel forum
7 risposte