Moștenire (Inheritance)

Numită și derivare, moștenirea este un mecanism de refolosire a codului și reprezintă posibilitatea de a defini o clasă care extinde o altă clasă deja existentă. Ideea de bază este de a prelua funcționalitatea existentă într-o clasă şi a adăuga noi funcţionalităţi şi/sau să le modifcăm pe cele existente.

Clasa existentă este numită clasa-părinte, clasa de bază sau super-clasă. Clasa care extinde clasa-părinte se numește clasă copil (child), clasă derivată sau sub-clasă.

Această moştenire se face cu ajutorul cuvântului cheie extends:

public class ChildClass extends ParentClass {

}

Moștenirea este un mecanism care permite crearea unor versiuni “specializate” ale unor clase existente (de bază). Moștenirea este folosită în general atunci când se dorește construirea unui tip de date care să reprezinte o implementare specifică (o specializare oferită prin clasa derivată) a unui lucru mai general. Un exemplu simplu ar fi clasa Câine care moștenește clasa Mamifer:

public class Animal {

}

public class Mamifer extends Animal {

}

public class Reptila extends Animal {

}

public class Caine extends Mamifer {

}

Pe baza exemplului de mai sus, următoarele sunt adevărate în termeni OOP:

  • Animal este o super-clasă a clasei Mamifer.
  • Animal este o super-clasă a clasei Reptile.
  • Mamifer şi Reptila sunt sub-clase ale clasei Animal.
  • Caine este o subclasă atât pentru clasa Mamifer cât şi pentru clasa Animal.

Deoarece o sub-clasă moşteneşte (preia) şi toate atributele şi metodele clasei părinte, se poate spune că, de exemplu, Caine este un Mamifer, ceea ce se numeşte o relaţie de tip IS-A:

  • Mammal IS-A Animal
  • Reptile IS-A Animal
  • Dog IS-A Mammal
  • Atunci : Dog IS-A Animal de asemenea

Exemplu

Exemplu

class Animal {
    public void eat() {
        System.out.println("Animal eating");
    }
}

class Wolf extends Animal {
    public void howl() {
        System.out.println("Wolf howling");
    }

    public void eat() {
        System.out.println("Wolf eating");
    }
}

class Snake extends Animal {
    public void bite() {
        System.out.println("Snake biting");
    }
}

class Test {
    public static void main(String[] args) {
        Wolf wolf = new Wolf();
        Snake snake = new Snake();

        wolf.howl();
        snake.bite();
        snake.eat();
        wolf.eat();
    }
}


După cum poate aţi intuit din exemplul de mai sus, moştenirea nu se limitează la o singură clasă. Orice sub-clasă poate fi extinsă de o altă clasă, care poate fi la rândul ei extinsă de o alta, şi tot aşa, formând ceea ce numeşte o ierarhie de clase. În exemplul de mai sus, Mamifer este o sub-clasă a clasei Animal, dar este o supra-clasă pentru clasa Caine. Iar clasa Caine moşteneşte toate atribuitele şi metodele clasei Mamifer, deci automat şi pe cele ale clasei Animal.

Java are o clasă specială numită Object, care este supraclasa tuturor celorlalte clase. Cu alte cuvinte, orice clasă din Java extinde clasa Object şi, implicit, are câteva metode comune tuturor claselor, ca de exemplu equals(), hashCode() sau toString().

Implicații

În Java, clasele și membrii acestora (metode, variabile, clase interne) pot avea diverși specificatori de acces.

  • specificatorul de acces protected - specifică faptul că membrul sau metoda respectivă poate fi accesată doar din cadrul clasei însăși sau din clasele derivate din această clasă. Clasele nu pot avea acest specificator, doar membrii acestora!
  • specificatorul de acces private - specifică faptul că membrul sau metoda respectivă poate fi accesată doar din cadrul clasei însăși, nu și din clasele derivate din această clasă. Clasele nu pot avea acest specificator, doar membrii acestora!

Pe lângă reutilizarea codului, moștenirea dă posibilitatea de a dezvolta pas cu pas o aplicație (procedeul poartă numele de incremental development). Astfel, putem folosi un cod deja funcțional.

Assignment

Faceți o aplicație care să conțină clasa Animal și mai multe subclase (tipuri de animale) care să aibă și atribute și metode specifice cum ar fi latra(), necheaza(), ciripeste(), miauna() etc.

Construiţi mai multe animale din fiecare tip.

Apelaţi metodele, încercați să folosiți atributele private ale superclasei în clasa derivată, creați o metodă toString() și afişaţi atributele diferitelor animale.

public class Animal {
   public void scoateSunet(){
      System.out.println(“Animalul scoate un sunet de animal (sunet generic).”);
   }
}

public class Pisica extends Animal{

   public void scoateSunet(){                   //OVERRIDING (SUPRASCRIERE)
      System.out.println(“Pisica miauna.”);
   }
   public void toarce(){
      System.out.println(“Pisica toarce.”);
   }	
}

Spunem că clasa Pisică a suprascris metoda scoateSunet() de la clasa Animal. Vezi capitolul despre Suprascriere pentru mai multe detalii.

Pisica pisica = new Pisica();
pisica.toarce();
pisica.scoateSunet();   // ce se va afisa?

Animal animal = new Animal();
animal.toarce();  //este posibil?

You could leave a comment if you were logged in.