PDA

View Full Version : [JAVA] Classi annidate e visibilità


wingman87
15-02-2008, 10:30
Come funziona la visibilità delle classi annidate e delle loro funzioni? Ad esempio:
public class Contenitore{
...
private class Contenuto{
...
public void unaFunzione(){
...
}
}
}
Se cambio la parte in rosso in private cambia qualcosa?

andbin
15-02-2008, 10:50
Come funziona la visibilità delle classi annidate e delle loro funzioni? Ad esempio:
public class Contenitore{
...
private class Contenuto{
...
public void unaFunzione(){
...
}
}
}
Se cambio la parte in rosso in private cambia qualcosa?Contenuto è una inner class private, quindi è visibile sono all'interno di Contenitore.

Essendo una inner class, c'è una relazione "particolare" tra Contenuto e Contenitore, tale per cui Contenitore può accedere a tutti i membri di Contenuto, pure quelli private.

Ma vale anche per altre inner class. Ecco un esempio:

public class Prova
{
public static void main (String[] args)
{
Prova p = new Prova ();
p.prova ();
}

public void prova ()
{
Inner i = new Inner ();
i.test1 (); // OK
i.test2 (); // OK, anche se private

Inner2 i2 = new Inner2 ();
i2.test_a (i);
}

private class Inner
{
public void test1 () { System.out.println ("test1"); }
private void test2 () { System.out.println ("test2"); }
}

private class Inner2
{
public void test_a (Inner i)
{
i.test1(); // OK
i.test2(); // OK, anche se private!!!
}
}
}

wingman87
15-02-2008, 18:14
Ma quindi non cambia nulla se metto private o public nelle funzioni?

Se invece la innerclass è public e la classe Contenitore è public posso instanziare la innerclass anche da classi esterne a Contenitore?

vladix
15-02-2008, 20:59
certo che si puo istanziare , la sintasi e + o - questa


Contenitore contenitore = new Contenitore();
Contenitore.Contenuto contenuto = contenitore .new Contenuto ();


poi x gli array

Contenitore contenitore = new Contenitore();
Contenitore.Contenuto [] contenuto =new Contenitore.Contenuto[lenght];

contenuto [indice] = contenitore .new Contenuto ();

wingman87
16-02-2008, 00:29
Ok, grazie!
Un'ultima domanda: quindi quando voi scrivete delle innerclass private poi i metodi e le variabili d'istanza come li dichiarate? Non mettete nulla? A sto punto mi sembra la soluzione più ovvia...