Homepage  Il progetto dsy.it è l'unofficial support site dei corsi di laurea del Dipartimento di Scienze dell'Informazione e del Dipartimento di Informatica e Comunicazione della Statale di Milano. E' un servizio degli studenti per gli studenti, curato in modo no-profit da un gruppo di essi. I nostri servizi comprendono aree di discussione per ogni Corso di Laurea, un'area download per lo scambio file, una raccolta di link e un motore di ricerca, il supporto agli studenti lavoratori, il forum hosting per Professori e studenti, i blog, e molto altro...
In questa sezione è indicizzato in textonly il contenuto del nostro forum


.dsy:it. .dsy:it. Archive > Didattica > Corsi N - Z > Programmazione
 
[aiuto] ereditarietà
Clicca QUI per vedere il messaggio nel forum
ste182
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

Smirne
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) :)

ste182
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?

Smirne
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);

ste182
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

Powered by: vbHome (lite) v4.1 and vBulletin v2.3.1 - Copyright ©2000 - 2002, Jelsoft Enterprises Limited
Mantained by dsy crew (email) | Collabora con noi | Segnalaci un bug | Archive | Regolamento |Licenze | Thanks | Syndacate