Modificatore public

di il
10 risposte

Modificatore public

Scusate ma credo di aver fatto confusione con modificatore public.
Esso è visibile a tutte le classi del package.
Non è una buona idea dichiarare una variabile public perchè può essere modificata da chiunque nel package.
Considerando la classe cane
package modprivate;


public class Cane {
    public String nome;
    public int anni;
    
}
La classe gatto
package modprivate;

/**
 *
 * @author Ang
 */
public class Gatto {
    
}
Nel main ho creato un oggetto cane e un oggetto gatto.
ackage modprivate;

/**
 *
 * @author Ang
 */
public class ModPrivate {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
       Cane c=new Cane();
       c.nome="rex";
       c.anni=12;
       
       Gatto g=new Gatto();
       g.nome="fufi";
    }
    
}
Perchè non riesco a modificare l'attributo nome. E' nella classe cane ma è public. Perchè l'oggetto di classe gatto non vi ha accesso?
Credo di aver frainteso il significato di public...

10 Risposte

  • Re: Modificatore public

    L'errore e' banale!
    Guarda bene che cosa hai scritto!!!
    Dove c'e' scritto che un gatto ha un nome?
  • Re: Modificatore public

    Si lo so. Pensavo che essendo public la variabile venisse come "ereditata" da tutte le altre classi...
  • Re: Modificatore public

    reynold ha scritto:


    Scusate ma credo di aver fatto confusione con modificatore public.
    Esso è visibile a tutte le classi del package.
    Una classe o un membro public è visibile a qualunque altra classe in qualunque package.
  • Re: Modificatore public

    Esatto, quindi quale può essere un esempio di utilizzo di una variabile public?
    L'utilizzo è deprecato e in OOP si preferisce usare variabili private
    Non ho ben capito come una variabile public può essere modificata dall'esterno.
    Ho capito che un oggetto di una classe accede direttamente alla variabile come nel mio esempio.
    Ma che senso ha che la variabile o il metodo public sia visibile a tutti i package?
    Per potere modificare tale variabile devo comunque dichiararla in una classe, quindi non è del tutto vero che tale variabile è visibile a tutte le classi. Se in una classe non è dichiarata la classe non la vede
  • Re: Modificatore public

    reynold ha scritto:


    Esatto, quindi quale può essere un esempio di utilizzo di una variabile public?
    Serve davvero raramente. Comunque un esempio è java.awt.Rectangle che ha i campi public. Ma dietro questa scelta ci sono ragioni "storiche".

    reynold ha scritto:


    Non ho ben capito come una variabile public può essere modificata dall'esterno.
    Avendo un riferimento ad un oggetto della classe A dove c'è il campo "di istanza" publico:

    varA.campo

    Se il campo fosse "di classe" (static) è più corretto:

    A.campo

    reynold ha scritto:


    Per potere modificare tale variabile devo comunque dichiararla in una classe, quindi non è del tutto vero che tale variabile è visibile a tutte le classi. Se in una classe non è dichiarata la classe non la vede
    Ma che vuol dire!?
    Se la classe A ha un campo di istanza x (public o protected o package level, comunque "accessibile" in base a dove si trova una classe B) allora la classe B può accedere al campo x di A ... ma a patto, ovviamente, che B abbia un riferimento ad un oggetto, istanza della classe A.
  • Re: Modificatore public

    Se la classe A ha un campo di istanza x (public o protected o package level, comunque "accessibile" in base a dove si trova una classe B) allora la classe B può accedere al campo x di A ... ma a patto, ovviamente, che B abbia un riferimento ad un oggetto, istanza della classe A.
    Cioè vuol dire che una variabile public int x dichiarata in A la devo dichiarare come public int x anche in B?
  • Re: Modificatore public

    reynold ha scritto:


    Cioè vuol dire che una variabile public int x dichiarata in A la devo dichiarare come public int x anche in B?
    No.
    Innanzitutto devi sempre ricordare che bisogna prima vedere il livello di accesso della classe, poi dei membri. Se una classe A non è accessibile da una classe B, allora neanche i membri di A sono accessibili da B!
    package uno;
    
    public class A {      // classe pubblica, accessibile da qualunque altra classe
        public int x;
    
        public A() {
            x = 10;
        }
    }
    package due;
    
    import uno.A;
    
    public class B {
        public static void main(String[] args) {
            A a = new A();
            System.out.println(a.x);    // accede al campo pubblico, stampa 10
        }
    }

    Ora invece cambiamo il livello di accesso di A:
    package uno;
    
    class A {      // livello di accesso di default (= package level)
        public int x;
    
        public A() {
            x = 10;
        }
    }
    Adesso la classe B NON compila proprio. Ti dà 3 errori, ovvero nei punti dove viene usato A. Perché la classe A ora è visibile solo all'interno del package uno.
  • Re: Modificatore public

    Grazie, ho capito che la mia confusione deriva da una scarsa conoscenza del package, infatti nelle prove che ho fatto ottenevo errori sul package
    Dunque package per me è solo un contenitore di classi.
    Ipotizzando classi public le domande che mi sorgono sono:
    1)perchè è necessario che A e B siano di sue package diversi? Non potrebbero appartenere entrambe al package A?
    2)import uno.A non mi è chiarissimo.Importo il package di A in B. Mi ritorna la domanda: A e B non possono appartenere allo stesso package?
    Questo era quello che facevo io inizialmente dove mi veniva giustamente detto che nella classe gatto non c'è la variabile public
    Al limite potrei creare nella classe B un metodo che crea un oggetto di classe A e modifica la variabile.
  • Re: Modificatore public

    Reynold a te mancano i concetti di base della programmazione ad oggetti, per esempio encapsulation, information hiding, messaging etc.

    Senza queste nozioni di base ti bloccherai in continuazione e il tuo codice farà piuttosto schifo.
  • Re: Modificatore public

    reynold ha scritto:


    1)perchè è necessario che A e B siano di sue package diversi? Non potrebbero appartenere entrambe al package A?
    Ti ho mostrato l'uso di due package solo come esempio per evidenziare cosa avviene tra package differenti con una classe con accesso di default piuttosto che public. Tutto qui.

    I package in Java sono innanzitutto una questione "strutturale", perché la regola fondamentale è che i nomi di package devono sempre "riflettersi" nella struttura delle cartelle.
    Ma i package hanno anche un utilizzo molto importante: servono per raggruppare tipi (classi, interfacce, enum, annotation) che sono logicamente correlati tra di loro.
    Nel framework standard, tutte le classi di I/O basilare sono nel package java.io, tutte le collezioni basilari sono in java.util, tutti i componenti grafici AWT sono in java.awt e così via.

    reynold ha scritto:


    2)import uno.A non mi è chiarissimo.Importo il package di A in B.
    Importa una classe specifica (la A). Non il package.

    reynold ha scritto:


    Mi ritorna la domanda: A e B non possono appartenere allo stesso package?
    Ti ripeto che era solo un esempio.
Devi accedere o registrarti per scrivere nel forum
10 risposte