.dsy:it.
Show 150 posts per page

.dsy:it. (http://www.dsy.it/forum/)
- Programmazione (http://www.dsy.it/forum/forumdisplay.php?forumid=259)
-- [aiuto] ereditarietà (http://www.dsy.it/forum/showthread.php?threadid=28948)


Posted by ste182 on 15-01-2007 13:08:

[aiuto] ereditarietà

ciao a tutti, non riesco a capire il concetto di extends in java.. dunque: ho capito che se estendo una classe A con un B nella B eredito i metodi e i campi della A.
faccio un esempio:
class A
{
int a =0;

public A(){
a = getCampo();
}

public int getCampo(){
return ++a;
}
}

class B extends A
{
int b=0;

public B()
{
b = getCampo();
}
}

se eseguo:
B obj = new B();
System.out.println("a = "+obj.a+" b = "+obj.b);

perchè stampa a=2 b=2 ?? quando costruisco a la incremento solo 1 volta quindi perchè esce 2?? help please

__________________
Live Fast, Die Fun


Posted by Smirne on 15-01-2007 14:27:

la prima istruzione del costruttore di ogni classe è una chiamata al costruttore della classe superiore.

Quindi quando esegui B obj = new B();

viene eseguito prima il costruttore di A (che contiene getCampo(), e incrementa quindi a al valore 1).

viene eseguito poi il contenuto del codice del costruttore, ovvero la chiamata di getCampo() che incrementa la variabile a, (che quindi diviene 2) e ne assegna il valore a b (sempre 2).

(credo) :)

__________________
www.welld.ch
Sviluppo software tra Italia e Svizzera


Posted by ste182 on 15-01-2007 14:37:

ah ecco! ora mi è chiaro! non la sapevo sta cosa della chiamata al costruttore della superclasse... ora avrei un'altra domanda riferita stavolta alla ricorsione:

class Prova
{
public static int f(int a, int b)
{
if (b < 0 || a < b)
return 0;
if(a == b && b >= 0)
return 1;
return f(a-1,b) + f(a-1,b-1) +1;
}
}

chiamando il metodo f(2,0) mi ritorna 3... non capisco come mai...

1) 0<0 falso e 2<0 falso
2)2==0 falso
quindi si richiama di nuovo f però con (1,0)

1) 0<0 falso 1<0 falso
2)1==0 falso
a diventa quindi 0 e b pure

1)0<0 falso
2)0==0 && 0>=0 vero!
quindi ritorno 1 e la prima parte dell'espressione l'ho risolta giusto?
(sarebbe return 1 + f(a-1,b-1) + 1)

ora passo al secondo termine ovvero f(a-1,b-1); qui devo partire dai valori iniziali 2,0 oppure da 0,0?

__________________
Live Fast, Die Fun


Posted by Smirne on 15-01-2007 15:20:

primo passaggio:
1) 0<0 falso e 2<0 falso
2)2==0 falso

quindi devo ritornare f(1,0) + f(1,-1) + 1;

cominciamo a eseguire f (1,-1). Per la condizione 1) (b<0) il risultato è 1.

quindi aggiorniamo: f(2,0) = f(1,0) + 0 + 1;

calcoliamo il valore di f(1,0):

1) 1<0 falso 1<0 falso
2)1==0 falso

dovro' ritornare f(0,0) + f(0,-1) +1;

f(0,-1) = 0 (per b<0, condizione 1)

f(0,0) = 1 (0 == 0, 0 >= 0, condizione 2)

quindi f (1,0) = 1 + 0 + 1 = 2;

torniamo a f(2,0) = f(1,0) + 0 + 1;
esso sarà 3= 2 + 0 + 1;

spero si capisca..dimenticavi il +1 quando eseguivi f(1,0);

__________________
www.welld.ch
Sviluppo software tra Italia e Svizzera


Posted by ste182 on 15-01-2007 16:01:

ah ho capito! grazie mille!
sai che facevo io? scomponevo l'espressione in pezzi e li eseguivo uno alla volta... in pratica trovavo prima il valore di f con a=1 b=0 e mi veniva 1 poi il valore di f(-1,-1) che dava 0.. quindi facevo 1+1+0=2..... ahaha che stupido....

grazie ancora!

cmq più che programazione mi sembra di studiare matematica... ahahahahahaha:D

__________________
Live Fast, Die Fun


All times are GMT. The time now is 19:32.
Show all 5 posts from this thread on one page

Powered by: vBulletin Version 2.3.1
Copyright © Jelsoft Enterprises Limited 2000 - 2002.