Discussione:
richiamare metodi di classi astratte
(troppo vecchio per rispondere)
Angela
2006-07-22 18:17:58 UTC
Permalink
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
s***@gmail.com
2006-07-22 18:41:34 UTC
Permalink
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!!
Post by Angela
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
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
zuperman
2006-07-22 19:57:43 UTC
Permalink
Post by s***@gmail.com
Spero che mi sono spiegato!!
Se sostituisci le occorrenze di "static*" con "astratt*"
nelle ultime 20 righe ti sei spiegato abbastanza.

Zuperman
Giambo
2006-07-22 21:14:13 UTC
Permalink
Post by Angela
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?
Dichiara una classe che estenda quella astratta (MyClass extends
MyAbstractClass). Quindi istanziala e usane i metodi.
--
Giambo - Occhio al filtro antispam _e_ alla whitelist !
Angela
2006-07-23 06:47:57 UTC
Permalink
Post by Giambo
Post by Angela
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?
Dichiara una classe che estenda quella astratta (MyClass extends
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!
Mc Osten
2006-07-23 07:27:30 UTC
Permalink
Post by Angela
Perchè ho impressione che
le classi che hanno questto difetto sono molte e diventa molto
dispendioso farlo per tutte.
Non è un difetto. Sinceramente ti consiglio di leggere un buon manuale
su Java, o meglio ancora un testo sulla progettazione di software ad
oggetti.

Per Java buoni testi sono CoreJava di Horstmann e Cornell (ma ce ne sono
tanti altri).

Per la programmazione ad oggetti, mi vengono in mente solo testi che
parlano anche di molto altro, oppure pensati per un altro linguaggio.
Non saprei darti un consiglio diretto.
Questo è abbastanza recente e mi sembra possa essere una cosa
interessante:
<http://www.pragmaticprogrammer.com/titles/kpiod/index.html>
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.
LittlePoorBoy
2006-07-23 07:32:00 UTC
Permalink
Post by Angela
Post by Giambo
Post by Angela
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?
Dichiara una classe che estenda quella astratta (MyClass extends
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!
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.
Giambo
2006-07-23 10:26:02 UTC
Permalink
Post by Angela
Post by Giambo
Post by Angela
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?
Dichiara una classe che estenda quella astratta (MyClass extends
MyAbstractClass). Quindi istanziala e usane i metodi.
Ma c'è solo questa strada da intraprendere?
Si, e' la Giusta Via(tm) :)
Post by Angela
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 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 !
--
Giambo - Occhio al filtro antispam _e_ alla whitelist !
Angela
2006-07-23 11:36:09 UTC
Permalink
Post by Giambo
Post by Angela
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 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 !
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!
Giambo
2006-07-23 16:12:56 UTC
Permalink
Post by Angela
Post by Giambo
Post by Angela
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 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 !
Forse ho scoperto che esistono delle classi che estendono quella che
stavo usando...
Con Eclipse se premi F4 hai la gerarchia delle classi.
Post by Angela
Purtroppo ho i file in formato .class quindi posso solo avvalermi della
documentazione per capire cosa fanno. Grazie a tutti cmq per l'aiuto!
E' un progetto opensource ? Non puoi decompilare usando jad ?
--
Giambo - Occhio al filtro antispam _e_ alla whitelist !
Loading...