Newsgroup: it.comp.java
Titolo: richiamare metodi di classi astratte

Ho visto che le classi astratte non possono essere istanziate, quindi
non è possibile creare oggetti. Me se nel mio programma ho bisogno di
accedere ad uno dei metodi di questa classe come faccio? io provo a
scivere qualcosa del tipo:
var2=nomeclasse.nomemetodo(var2)
ma mi dice che il metodo NON statico non può essere referenziato da un
contesto statico. Qualcuno mi può spiegare cosa succede e come
risolvere il problema? Grazie

Ciao Angela,
i metodi statici sono metodi legati alla classe, e non alla singola
istanza.
Ovvero, per richiamarli scrivi NomeClasse.metodo(); non devi creare
istanze.
per dichiarare un metodo statico si dichiara cosi: public static void
...
le classi statiche sono un'altra cosa, e cioe classi che non possono
essere istanziate.
Tu dirai, a che servono?
perche una qualsiasi classe che EREDITA da quella statica,
automaticamente ha bello e pronto a sua disposizione il metodo della
classe statica.
Morale: per chiamare un metodo della classe statica, devi istanziare un
oggeto di una classe che la eredita:
static class STATIC_CLASS {
  public void m() { ... }
}
class X extends STATIC_CLASS
{
}
STATIC_CLASS item = new X(); // lo posso fare; X non è statica
item.m();
Spero che mi sono spiegato!!
Angela ha scritto:


> Spero che mi sono spiegato!!
Se sostituisci le occorrenze di "static*" con "astratt*"
nelle ultime 20 righe ti sei spiegato abbastanza.
Zuperman

 accedere ad uno dei metodi di questa classe come faccio?
Dichiara una classe che estenda quella astratta (MyClass extends 
MyAbstractClass). Quindi istanziala e usane i metodi.
-- 
Giambo - Occhio al filtro antispam _e_ alla whitelist !

 MyAbstractClass). Quindi istanziala e usane i metodi.
Ma c'è solo questa strada da intraprendere? Perchè ho impressione che
le classi che hanno questto difetto sono molte e diventa molto
dispendioso farlo per tutte... A meno che non le richiamo dal main (che
è statico)... boh!


Ma non prenderlo prima di averlo sfogliato.
-- 
blog:  
http://www.akropolix.net/rik0/blogs
 | Uccidete i filosofi,
site:  
http://www.akropolix.net/rik0/
      | tenetevi riso e
forum: 
http://www.akropolix.net/forum/
     | bacchette per voi.




C'è essenzialmente *solo questa* strada da intraprendere, anche se
con alcune varianti: non si tratta comunque di un difetto, la creazione
di classe astratte dovrebbe anzi facilitare l'organizzazione della
struttura ad oggetti del programma nel suo complesso.
Vado ad esemplificare:
public abstract class A {
    public void a1() {
        //...
    }
    public abstract void a2();
    public static void a3() {
        //...
    }
}
Trattasi di una classe astratta A che implementa un metodo "normale"
a1() ed un metodo statico a3() e dichiara un metodo astratto a2().
Dall'esterno (main() oppure altra classe non correlata) posso
richiamare solo il metodo statico: A.a3() , mentre non posso
richiamare i metodi non statici perchè mi servirebbe un'istanza
della classe A che, di per sè, non è istanziabile:
new A() -> errore
A questo punto se ho una classe:
public class B extends A {
    public abstract void a2() {
        //...
    }
}
che per forza di cose implementa il metodo a2() lasciato "incompleto"
altrimenti avrebbe dovuto venir dichiarata anch'essa astratta,
posso tranquillamente dall'esterno scrivere il seguente codice:
b = new B();
b.a1();
b.a2();
b.a3();
B.a3();
A.a3();
In realtà avrei anche potuto scrivere fin dall'inizio:
(new A() {
    public abstract void a2() {
        //...
    }
}).a1();
dove, però, non sto istanziando direttamente un oggetto della classe A
ma sto definendo al volo una classe senza nome che estende la classe
A, ricavando un'istanza di questa ed usandola per richiamare il metodo
non statico a1().
Un utilizzo reale di quanto qui sopra illustrato avviene, per esempio,
solitamente con i Listener degli eventi, anche se lì si tratta di
interfacce.
Dimmi se è chiaro.

 è statico)... boh!
Ma chi ha implementato le classi ? Parli di difetto, puoi correggerlo ?
Solitamente chi ha deciso che una classe e' astratta avra' avuto le sue 
buone ragioni !


 buone ragioni !
Forse ho scoperto che esistono delle classi che estendono quella che
stavo usando...
Purtroppo ho i file in formato .class quindi posso solo avvalermi della
documentazione per capire cosa fanno. Grazie a tutti cmq per l'aiuto!

 documentazione per capire cosa fanno. Grazie a tutti cmq per l'aiuto!
E' un progetto opensource ? Non puoi decompilare usando jad ?
