PDA

View Full Version : [JAVA] Aiuto su ereditarietà


marcoqwertyuiop
23-05-2015, 18:05
Salve, sto cercando di capire l'ereditarietà in java.

In questo codice
class Quadrilatero {

int latoA;
int latoB;
int latoC;

public Quadrilatero (int a, int b, int c, int d) {

int latoA = a;
int latoB = b;
int latoC = c;
int latoD = d;
}

static int perimetro (int a, int b, int c, int d) {

return a+b+c+d;


}

public class Rettangolo extends Quadrilatero {

public Rettangolo (int a, int b) {

super (a, b, a, b);


}


}
public static void main(String[] args) {
Rettangolo uno = new Rettangolo (10,10);
System.out.println(perimetro(uno));
}
}

La classe Quadrilatero riceve quattro parametri, il metodo perimetro li somma e restituisce il perimetro.
La classe Rettangolo derivata da Quadrilatero riceve solo 2 parametri (visto che i lati dei rettangoli sono uguali in coppia).
Ma perchè se creo un oggetto rettangolo e gli do due parametri, invece di restituirmi il perimetro mi da errore?

paooolino
24-05-2015, 09:49
il codice non è corretto... la classe Rettangolo non la devi dichiarare all'interno della classe Quadrilatero... deve essere dichiarata al di fuori, esattamente come fosse un'altra classe qualsiasi...

Amsirak
24-05-2015, 11:34
Un altro problema è che perimetro vuole comunque 4 parametri interi, mentre tu gliene hai passato uno solo (e non intero, ma di tipo Rettangolo).

Ti conviene vederti anche le basi della sintassi, insieme all'ereditarietà... Nonché i concetti di oggetto/classi e i modificatori (quello static del metodo perimetro ti impedisce di chiamare il metodo sull'oggetto)

gianmpu
24-05-2015, 11:58
Quoto anch'io il consiglio su un ripasso generale. Infatti, oltre a quanto ti è già stato detto, leggndo velocemente:
1) La dichiarazione della classe quadrilatero ha solo tre lati
2) Se la classe quadrilatero ha solo un costruttore in cui vengono passate le misure dei lati, non ha senso passare nuovamente tali dati quando si deve calcolare il perimetro

marcoqwertyuiop
25-05-2015, 16:51
Ok, adesso funziona:

class Quadrilatero {
int latoA;
int latoB;
int latoC;
int latoD;
public Quadrilatero(int a, int b, int c, int d) {
latoA = a;
latoB = b;
latoC = c;
latoD = d;
}
public int perimetro() {
return latoA + latoB + latoC + latoD;
}
public static void main(String[] args) {
Rettangolo uno = new Rettangolo(3, 3);
System.out.println(uno.perimetro());
}
}
class Rettangolo extends Quadrilatero {
public Rettangolo(int a, int b) {
super(a, b, a, b);
}
}

marcoqwertyuiop
25-05-2015, 17:24
Con lo static si puòfare così:

class Quadrilatero {
int latoA;
int latoB;
int latoC;
int latoD;
public Quadrilatero(int a, int b, int c, int d) {
latoA = a;
latoB = b;
latoC = c;
latoD = d;
}
static int perimetro(Quadrilatero q) {
return q.latoA + q.latoB + q.latoC + q.latoD;
}
public static void main(String[] args) {
Quadrilatero uno = new Quadrilatero(1, 1, 1, 1);
Rettangolo due = new Rettangolo(2, 3);
System.out.println(Quadrilatero.perimetro(uno));
System.out.println(Quadrilatero.perimetro(due));
}
}
class Rettangolo extends Quadrilatero {
public Rettangolo(int a, int b) {
super(a, b, a, b);
}
}

Qual è la differenza nell'usare lo static nel metodo? Quando è consigliato usarlo?

[Kendall]
25-05-2015, 20:19
Con lo static si puòfare così:

class Quadrilatero {
int latoA;
int latoB;
int latoC;
int latoD;
public Quadrilatero(int a, int b, int c, int d) {
latoA = a;
latoB = b;
latoC = c;
latoD = d;
}
static int perimetro(Quadrilatero q) {
return q.latoA + q.latoB + q.latoC + q.latoD;
}
public static void main(String[] args) {
Quadrilatero uno = new Quadrilatero(1, 1, 1, 1);
Rettangolo due = new Rettangolo(2, 3);
System.out.println(Quadrilatero.perimetro(uno));
System.out.println(Quadrilatero.perimetro(due));
}
}
class Rettangolo extends Quadrilatero {
public Rettangolo(int a, int b) {
super(a, b, a, b);
}
}

Qual è la differenza nell'usare lo static nel metodo? Quando è consigliato usarlo?

I Metodi statici sono per l'appunto metodi legati al tipo e non all'istanza del tipo stesso.
Nell'esempio da te riportato ha poco senso, oltre ad essere concettualmente errato dal mio punto di vista, in quanto il perimetro è una proprietà delle singole istanze di rettangolo o di quadrato, pertanto è corretto che sia implementato come metodo d'istanza.

marcoqwertyuiop
26-05-2015, 14:33
ok grazie.