Newsgroup: it.comp.java
Titolo: Dubbi... ereditari

Ciao!
Sto` imparando Java ed ho un piccolo dubbio sull'ereditarieta`. Poniamo
di avere il suguente sorgente:
----------
class Classe1 {
    Classe1(String s) {
	System.out.println(s);
    }
}
class Classe2 extends Classe1 {
    Classe2(String s) {
      super(s);
    }
}
public class ProvaEred {
    public static void main (String[] args) {
	Classe1 Prova = new Classe1("Prova Classe1");
	Classe2 Prova2 = new Classe2("Prova Classe2");
    }
}
---------
Funziona benissimo e l'output e` esattamente quello che ci si aspetterebbe.
I problemi sorgono se rimuovo il constructor in Classe2: al momento della
compilazione ottengo:
---------
ProvaEred.java:9: No constructor matching Classe1() found in class Classe1.
class Classe2 extends Classe1 {
      ^
ProvaEred.java:21: Wrong number of arguments in constructor.
	Classe2 Prova2 = new Classe2("Prova Classe2");
	                 ^
2 errors
---------
 
E` un comportamento normale? Non dovrebbe essere ereditato il constructor
della classe padre se non ne specifico uno? O devo specifcarne uno anche
SOLO per chiamare quello del padre?
	Grazie, Michele.
-- 
Michele Beltrame
mi...@io.com
http://www.italpro.com/mb/

Ciao!
Sto` iniziando a programmare in Java ed ho un dubbio sull'ereditarieta`.
Prendiamo ad esempio il seguente sorgente:
==========
class Classe1 {
    Classe1(String s) {
	System.out.println(s);
    }
}
class Classe2 extends Classe1 {
    Classe2(String s) {
	super(s);
    }
}
public class ProvaEred {
    public static void main (String[] args) {
	Classe1 Prova = new Classe1("Prova Classe1");
	Classe2 Prova2 = new Classe2("Prova Classe2");
    }
}
==========
Il programma funziona bene e fornisce l'output che ci si puo`
aspettare. Se tuttavia TOLGO il constructor da Classe2 allora
il programma non compila, generando il seguente errore:
==========
ProvaEred.java:9: No constructor matching Classe1() found in class Classe1.
class Classe2 extends Classe1 {
      ^
ProvaEred.java:21: Wrong number of arguments in constructor.
	Classe2 Prova2 = new Classe2("Prova Classe2");
	                 ^
2 errors
==========
Il constructor non viene quindi automaticamente ereditato, pare, e sono
costretto a riscriverlo inserendovi la SOLA chiamata al padre (in quando
non mi serve metterci altro). E` la prassi? Cioe', i constructor non
vengono mai ereditati?


SOLO per chiamare quello del padre?
Ci hai preso in pieno: i costruttori non si ereditano.  Se una classe non
chiama esplicitamente altri costruttori (con super(blah blah) nei propri
costruttori), la classe che essa estende viene automaticamente
inizializzata col proprio costruttore di default (cioe` senza argomenti),
ed e` quindi un errore se non he ha uno.
Alex

 vengono mai ereditati?
Si'
-- 
"Despite all my rage I'm still just a rat in a cage"


wrote:

Non ho mai fatto esperimenti a riguardo e non ho mai nemmeno guardato
le specifiche del linguaggio in tale proposito ma se Classe1 avesse
implementato un costruttore vuoto (cioe' senza parametri) non sarebbe
forse stato invocato? In fin dei conti l'errore riportato sostiene che
manca proprio un costruttore vuoto alla classe padre!
Ciao!
Matteo!!!

manca proprio un costruttore vuoto alla classe padre!
Si`, appunto come dico: poiche` la classe derivata non chiama
esplicitamente un costruttore della classe che estende, di
quest'ultima viene implicitamente invocato il costruttore di default
(o "vuoto", "senza parametri", "senza argomenti", che dir si
voglia); quindi, vi e` un errore di compilazione se un tale ctor
non esiste.
Se per una classe non si e` definito un costruttore (ctor) di
default, e` evidentemente perche` una sua "inizializzazione di
default" non ha senso, e vanno invece sempre chiamati i
suoi costruttori con opportuni argomenti; questo, dunque, va
in particolare fatto esplicitamente dalle classi che la estendono,
nei _loro_ costruttori -- e questi vanno esplicitamente definiti,
poiche`, come l'autore originale del thread ipotizzava ed io ho
gia` confermato, i costruttori NON si ereditano in Java.
Alex