Documente Academic
Documente Profesional
Documente Cultură
2021
class Test{
public static void main(String args[]){
PunctColor p1=new PunctColor(1,2,"red");
PunctColor p2=new PunctColor(1,2,"white");
double d12=p1.distanta(p2);
System.out.println("distanta="+d12);
p1.afisare();
}
}
INLANTUIREA CONSTRUCTORILOR
(constructor chaining)
Crearea unui obiect dintr-o clasa (cu new) implica apelul implicit al
constructorilor
tuturor superclaselor, de-alungul lantului de mostenire.
Atentie: se vor apela implicit, chiar daca lipseste apelul explicit cu super() !
class F extends T
...
class T extends B
...
Constructor chaining:
F obj=new F();// Cand se apeleaza new , se va intra in constructor clasa F si
primul lucru pe care-l va face: va apela
//constructorului tatalui lui F, deci constructorul lui T.
//Primul lucru pe care-l va face constructorul lui T: va apela constructorul
tatalui lui,
// deci va apela constructorul lui B.
Exemplu:
//clasa stramos pt celelalte din lantul de derivare:
class A{ //clasa bunic
public A(){
System.out.println("Sunt stramosul A");
}
}
class TestInlantuireConstructori{
public static void main(String args[]){
class TestInlantuireConstructori{
public static void main(String args[]){
new AAA();//obiect anonim
/* Va afisa:
Sunt stramosul A
Sunt AA, fiul lui A
Sunt AAA, fiul lui AA
*/
}
/////////////
MOdificam programul astfel:
class A{
public A(){
System.out.println("Sunt stramosul A");
}
}
class AA extends A{
public AA(){
System.out.println("Sunt AA, fiul lui A");
}
public AA(int x){
System.out.println("Sunt AA, al doilea constructor, cu x="+x);
}
}
class AAA extends AA{
public AAA(){
super(12);//apelez explicit un constructor din clasa de baza (AA)
System.out.println("Sunt AAA, fiul lui AA");
}
}
class TestInlantuireConstructori{
public static void main(String args[]){
new AAA();//obiect anonim
/* Va afisa:
Sunt stramosul A
Sunt AA, al doilea constructor, cu x=12
Sunt AAA, fiul lui AA
*/
}
class ContBancar{
private double suma;//suma de bani din cont
public ContBancar(double suma){
this.suma=suma;
}
public void adauga(double x){
suma=suma+x;
}
public boolean extrage(double x){
if(suma>=x){
suma=suma-x;
return true;
}else return false;
}
public double get(){ return suma;}
}
class TestContBancar{
public static void main(String args[]){
ContBancarCuDobanda cbd=new ContBancarCuDobanda(1000);
cbd.adauga(1000);
double d=cbd.getDobandaAnuala();
System.out.println("dobanda anuala la suma de "+cbd.get()+" este: "+d);
}
}
Observatie importanta :
Se poate folosi tipul clasei de baza , in locul tipului clasei derivate
Invers, nu !
Object obj=new Patrat(); //Da, corect Un Patrat este un Object . Invers, nu
//Tipul declarat al lui obj este Object. Tipul rezultat din instantiere este
Patrat.
int S=obj.arie(); NU, pt ca in clasa Object , nu e definita metoda arie()
int S=((Patrat))obj.arie();
Nu se poate invers:
Patrat p=new Object(); GRESIT !
Putem avea:
class D extends A {....}
abstract class A{
abstract public void calcul(int N);
public long durataCalcul(int N){
//cat dureaza executia metodei calcul() ?
long t1=System.currentTimeMillis();
calcul();
long t2=System.currentTimeMillis();
return (t2-t1);
}
}
class AA extends A{
//mosteneste met. durataCalcul()
public void calcul(int N){
//un calcul pt a consuma timp procesor
int i, j,k;
for(i=1;i<=N;i++)
for(j=1;j<=N;j++)
for(k=1;k<=N;k++)
int rezultat=i*j*k;
}
}
class Test{
public static voiod main(String args[]){
AA aa=new AA();
System.out.println("durata="+aa.durataCalcul());
}
}