Newsgroup: it.comp.java
Titolo: this nelle sottoclassi...

ho questa situazione tipo:
class c1 {
  int i=0
 
  class c2 {
    void prova() {
 
    }
  }
}
in prova() non posso richiamare "this.i" perché è una proprietà della classe 
padre. basta togliere il this. e tutto tace. ma c'è una cosa simile al this 
che però si riferisce alla classe padre?
-- 
by \ \/ /\/
PerezDeQueya80 on AzzurraNET.org

 che però si riferisce alla classe padre?
Si, super, ma dato che non sono classi "padre e figlio" non ti serve a molto
-- 
Lawrence "Rhymes" Oluyede
http://loluyede.blogspot.com

Riguardo al problema, quello che ti ha detto Lawrence sul perchè il This non
va bene è giustissimo, per quanto ne so.
Riguardo poi alla soluzione, prova ad usare c1.this.i, dovrebbe
funzionare...
Ciao
Giacomo

 che però si riferisce alla classe padre?
c2 non è una sottoclasse di c1, quindi super. non c'entra niente.
c2 è una classe membro che ha accesso alla variabile i di c1 allo
stesso modo con cui un qualsiasi metodo foo() interno a c1 avrebbe
accesso a tale variabile.
nella classe c2 non è definita alcuna variabile i, this. può riferirsi
solo a c1


?
Un semplice c1.i non funziona?
-- 
Marco "Duff" Palermo
http://www.marcoduff.com/

> Un semplice c1.i non funziona?
Ora dico una bischerata... il che è sempre possibile: c1.i non si riferisce
ad un contesto statico? Se è così e "i" non è statica, non che non
funziona...
Ciao
Giacomo


E' una bischerata! :D
i e' una qualunque variabile (alla quale si abbia accesso dall'esterno)
della classe a cui appartiene c1 (sia normale che static che final che
qualsiasi altra cosa!).


Rispondo a Giacomo Ciani che in data 10/01/2004 alle 18:19 ha scritto:

E' una bischerata! :D
i e' una qualunque variabile (alla quale si abbia accesso dall'esterno)
della classe a cui appartiene c1 (sia normale che static che final che
qualsiasi altra cosa!).


 qualsiasi altra cosa!).
Non ti seguo... c1 non "appartiene" a nessuna classe, _è_ una classe; e _non
è_ un'istanza... nè deduco che se scrivi
c1.i
e non
[istanza di c1].i
"i" deve per forza essere statica... dov'è che sbaglio?
A conferma di quanto dico, il BorlandMake (complatore della borland) al
codice:
class c1 {
  int i = 0;
  class c2{
    public void prova(){
      System.out.println(c1.i); //riga 9
    }
  }
}
reagisce con un bel:
"c1.java": non-static variable i cannot be referenced from a static context
at line 9, column 29
mentre lo digerisce senza problemi con la sostituzione "c1.i" -->
"c1.this.i"
Ciao
Giacomo

 [istanza di c1].i
[CUT]
Ops! Perversione mentale mia!
c1 scritto con la "c" minuscola!
Mi sembrava che c1 era una istanza della classe C1!
Sono caduto in errore... Troppo abituato agli "standard non ufficiali e
manco ufficiosi" che dicono che il primo carattere dei nomi delle classi si
scrive in maiuscolo e quello delle instanze in minuscolo.
Vedendo scritto c1 ho pensato si trattasse di una istanza della classe.
Ti chiedo scusa!
Tornando al thread di partenza avevo visto scritto:
c1.this.i
Che la mia mente ha letto:
[istanza_di_C1].this.i
il che non mi era sembrato affatto corretto (ed in effetti non lo e').
Ma essendo c1 (ahime') una classe e' giustissimo scrivere
c1.this.i


Ok, risolto!  ;-)
Ciao
Giacomo

 
Certo che siete duri quasi quanto me. ;-)
Una variabile può essere dichiarata static oppure niente. Niente
significa che la variabile è relativa ad una "istanza" della classe.
Quando facciamo MiaClasse gianna = new MiaClasse() richiediamo di
eseguire:
- MiaClasse gianna 
dichiaro per questo blocco di codice una variabile di nome gianna che
si riferirà ad una istanza di classe MiaClasse (java è pignolo).
- new MiaClasse()
cara JVM, carica in memoria la classe MiaClasse con tutti gli antenati
(variabili static, metodi static e metodi normali), impegna in memoria
da qualche parte lo spazio necessario per contenere le variabili (come
"int i") e inizializza le variabili in memoria secondo quanto definito
nella dichiarazione (i=0), quindi esegui il costruttore MiaClasse()
- gianna =
assegna al puntatore gianna l'indirizzo di memoria della istanza
- a questo punto nel codice del blocco posso utilizzare gianna per
riferirmi ed utilizzare ai suoi metodi e variabili istanza
Non so se è ESATTAMENTE così, ma l'idea è quella.
c1.i si incazza come un caimano perchè a quel punto della esecuzione
non è stato eseguito new c1() e non esiste alcuna istanza di c1 da cui
prendere il valore di i. Meno che mai posso pretendere di leggere i
dalla classe c1 (lo vado a prendere da quale istanza?
una-nessuna-centomila?) che è il significato del messaggio
"non-static variable i cannot be referenced from a static context" che
all'incirca significa che i non è static.
Ciao

Ti ringrazio della spiegazione, ma ti devo fare notare che, benchè mai
sgradita, in questo caso è stata abbastanza inutile: avevamo infatti chiaro
il funzionamento delle varivìbili static e di istanza; quello che ci
chiedevamo è come accedere esplicitamente da una inner class ad una varibile
di istanza quando questa sia "nascosta", e lo si fa con [outer
class].this.[variabile di istanza].
Tutto il resto è solo un equivoco nato dal fatto che MarcoDuf si è
imborgliato a leggere...
Ciao ciao
Giacomo

No problem. 
Mi sono incasinato nel thread.
Ciao