PDA

Visualizza la versione completa : [java] modificatori di visibilità


Lucked
02-12-2004, 01:31
Hola gente!
Parliamo di modificatori di visibilità.
Ho una classe che contiene altre classi dichiarate protected, insieme a variabili e metodi anch'essi protected.

Quale è il senso? Quando è il caso di usare questo prefisso?

GRAZIE 1000 :smack: :smack: :smack:

LeleFT
02-12-2004, 14:34
Il modificatore protected fa sì che l'oggetto dichiarato tramite questo modificatore sia accessibile da qualsiasi parte del codice di una classe che faccia parte del package della classe che contiene l'oggetto. Esempio:


------ Classe A.java ------
package mioPackage;

public class A {
protected int VALORE;
public A(int v) { VALORE = v; }
}

------ Classe B.java ------
package mioPackage;

public class B {
public static void main(String [] ar) {
A uno = new A(8);
System.out.println(uno.VALORE); // <- lo posso fare!
}
}
Ciao. :ciauz:

alka
02-12-2004, 16:31
Originariamente inviato da LeleFT
Il modificatore protected fa sì che l'oggetto dichiarato tramite questo modificatore sia accessibile da qualsiasi parte del codice di una classe che faccia parte del package della classe che contiene l'oggetto.

Se non sbaglio, il modificatore protected rende il membro accessibile a qualsiasi classe discendente, anche di package differente; lo scopo principale è quello di rendere estensibile una classe, ma impedire che l'utilizzatore diretto di quella classe che beneficia delle funzionalità offerte dalle istanze acceda a metodi che non dovrebbero essere chiamati direttamente.

Ciao! :ciauz:

LeleFT
02-12-2004, 16:48
Originariamente inviato da alka
Se non sbaglio, il modificatore protected rende il membro accessibile a qualsiasi classe discendente, anche di package differente;

No. Anche se una classe estende la classe che contiene l'oggetto protected, essa non può accedere a tale membro se non fa parte dello stesso package. Questo codice, ad esempio, non viene compilato:


package A;

public class ClasseA {
protected int VALORE;
public ClasseA(int v) { VALORE = v; }
}


-------------------------------

package A.B;

import A.*;

public class ClasseB extends ClasseA {
public ClasseB() { super(0);}
public static void main(String [] ar) {
ClasseA ca = new ClasseA(5);
System.out.println(ca.VALORE);
}
}

L'istruzione in grassetto solleva questo errore:
«VALORE has protected access in A.ClasseA»


Ciao. :ciauz:

alka
02-12-2004, 16:56
Originariamente inviato da LeleFT
No. Anche se una classe estende la classe che contiene l'oggetto protected, essa non può accedere a tale membro se non fa parte dello stesso package.

Confermo. Sono abituato a lavorare in altri linguaggi ove non esiste questo tipo di protezione. :)

Ciao! :ciauz:

Lucked
02-12-2004, 21:57
Ok Lele, graxie..pero a me non è mai capitato di usare i package. Metto tutte le classi in un uniko file. :) :) :)
Ho provato a fare cosi:



class A {
protected int VALORE;
public A(int v) { VALORE = v; }
}



public class B {
public static void main(String [] ar) {
A uno = new A(8);
System.out.println(uno.VALORE); // <- lo posso fare!
}
}

e funziona...è come se fosse pubblica per la classe B
credo che protected abbia un senso solo usando i package.
Che ne dite? :ciauz:

LeleFT
02-12-2004, 23:48
Sì... non vedo altri motivi per usare questo modificatore.


Ciao. :ciauz:

Lucked
02-12-2004, 23:59
grazie..era proprio la risposta che cercavo. :ciauz:

Lancill
03-12-2004, 00:14
Ovviamente funziona anche se si estende la classe.
Faccio un esempio:

ClasseA


public class ClasseA {

protected String s = "ciao";

public ClasseA(){
}

}


ClasseB


public class ClasseB extends ClasseA{

private String st;

public ClasseB(){
st = super.s;
}

public void stampa(){
System.out.println(st);
}
}

Lucked
03-12-2004, 00:54
Ciao Lancill, molto bello anke il tuo esempio.
Riassumendo, si puo accedere alle variabili protette:

1)sia da sottoclassi
2)che da classi che si trovano nello stesso pacchetto.

chiedo ancora qualcosa: piu classi che si trovano in un file - è o no un pacchetto?

se fosse una var pubblica guadagnerei solo sul fatto che puo essere vista da un altro pacchetto o sbaglio?

Loading