Forse non mi sto spiegando bene o, probabilmente, non hai familiarità con i nomi tecnici.
Faccio uno schemino prendendo come esempio il metodo "main":
codice:
public static void main(String[] args)
^ ^ ^ ^ ^ ^
| | | | | +---- nome del parametro
| | | | +------------ tipo del parametro
| | | +------------------ nome del metodo
| | +----------------------- tipo di ritorno
| +------------------------------ modificatore
+------------------------------------- tipo di accesso
Questo è il classico metodo main. Come ogni altro metodo ha in comune la sua struttura.
Il metodo main è costituito dai seguenti componenti: un tipo di accesso, un modificatore, un tipo di ritorno, il nome del metodo, un parametro (il parametro è a sua volta identificato da un tipo e da un nome).
Quando nei miei messaggi precedenti ti ho detto che il metodo accendi() non dovrebbe avere alcun parametro, parlavo, appunto, di quelle cose che vengono messe tra le parentesi tonde del metodo. Un metodo può avere dei parametri (il main ne ha uno, si chiama "args" ed è di tipo String[]), ma può anche non averne (perchè non è obbligatorio che al metodo venga passato qualcosa perchè funzioni). E' il caso del metodo accendi; secondo la logica, un metodo come quello non dovrebbe ricevere alcun parametro, perchè lui sa già chi è che deve essere acceso: l'oggetto su cui viene invocato.
Quindi, per prima cosa, io sistemerei quel metodo: la chiamata è un'altra cosa senza alcun senso... La classe Lampada, come già detto, non possiede alcun attributo statico chiamato "lamp".
Quando tu scrivi Lampada.lamp stai cercando di riferirti ad una variabile statica definita dentro la classe Lampada... la tua classe Lampada, come già detto, non ha alcuna variabile statica, quindi scrivere Lampada.qualcosa non ha nessun senso (se non per il main, ma è addirittura più senza senso di quell'altra cosa).
Quindi "Lampada.lamp" è una cosa che non esiste ed il compilatore lo sa e te lo segnala.
Ciao.