marți, 6 iulie 2010

Tot despre constructori


In continuarea exercițiului anterior, iată încă un exemplu pentru a înțelege mai bine funcționarea constructorilor in conjuncție cu extinderea claselor.
 
/**
 * Creati fisierul TestSuperInConstructori.java si copiati codul
 * de mai jos.
 * Ce se intampl
a cand incercati sa compilati ?
 * Stergeti linia cu eroare. Rulati programul.
 * Ce se afiseaza in consol
a ?
 * Decomentati linia "//super();" si rulati iar. Ce se schimb
a?
 * Inlocuiti super(); cu super("blablabla"); si rulati iar. Ce se

 *
schimba ?
 * Ce se schimba daca inlocuiti super(); cu new Parinte(); ?
 */
public class TestSuperInConstructori {
    public static void main (String [] args){
        new Copil();
        System.out.println("-------");
        new Copil(2);
    }
}
class Parinte {
    Parinte(){
        System.out.println("constructor Parinte()");
    }
    Parinte(String s){
        System.out.println("constructor Parinte(" + s + ")");
    }
}
class Copil extends Parinte{
    Copil(){
        System.out.println("constructor Copil()");
          super("abc");
    }
    Copil(int i){
//        super();       
        System.out.println("constructor Copil(" + i + ")");
    }
}

2 comentarii:

  1. Hi,

    -La compilare, apare eroare pentru ca in clasa Copil, call-ul explicit catre constructorul Parinte (super("abc");) nu este inserat in prima linie din constructor
    -Stergand linia cu eroare, programul compileaza si rezulta output-ul:
    constructor Parinte()
    constructor Copil()
    -------
    constructor Parinte()
    constructor Copil(2)
    -Decomentand linia "//super();", nu se schimba nimic..rezulta acelasi output
    -Schimband "super();" cu "super("blablabla");", rezulta output:
    constructor Parinte()
    constructor Copil()
    -------
    constructor Parinte(blablabla)
    constructor Copil(2)

    (se apeleaza constructorul cu parametri din clasa Parinte..)
    -Daca inlocui "super();" cu "new Parinte();", rezulta:
    constructor Parinte()
    constructor Copil()
    -------
    constructor Parinte()
    constructor Parinte()
    constructor Copil(2)
    (deci, practic se creeaza 2 obiecte de tip Parinte)

    Bye

    RăspundețiȘtergere
  2. Asa este :) de ce trebuie ca linia super() sa fie prima din constructor? (e valabil si pentru this()).

    RăspundețiȘtergere