---
# System prepended metadata

title: L'héritage
tags: [Java]

---

# L'héritage

Une classe peut étendre une autre classe. 
Via le mot clé `extends`, une classe peut hériter des propriétés et méthodes d'une autre classe.
Il y aura donc une class mère et une class fille(celle qui hérite).

Une classe ne peut hériter que d'une seule classe.

```
/**
* Class mère
*/
public class Robot {
    private int battery = 100;
    
    protected int discharge(int value) {
        battery -= value;
        if(battery < 0) {
            battery = 0;
        }
        return battery;
    }
    
    public boolean isOn() {
        return battery > 0;
    }
    public void getName(){
        System.out.println("I'm a Robot")
    }
}
```

```
/**
* Class fille
*/
public class CleaningBot extends Robot {
    /* La class fille peut tout à fait avoir ses propres propriétés */
    private int dustBag = 0; 
    
    public void clean() {
        /* La classe CleaningBot à alors accès à la méthode isOn(); 
        initialisé dans son parent */
        if(!isOn()){ 
            System.out.println("Robot out of power");
            return;
        }

        if(dustBag+5 < 100) {
            dustBag += 5;
            discharge(10);
            System.out.println("Dadidou, cleaning the house");
        }
    }
}
```

la class fille peut ensuite modifier les methodes de la class mère grace au polymorphisme. l'indiquation @Override permet de préciser le polymorphisme

```
/**
* Class fille
*/
public class CleaningBot extends Robot {
    
    private int dustBag = 0; 
    
    ...
        
    @Override
    public void getName(){
        System.out.println("I'm a CleaningBot")
    }
}
```

La façon d'instacier l'objet à une grande importance, on peut 
* soit instancier avec le type de la class mère et l'objet n'aura que les methodes de la class mère avec leur implementations.
* soit avec le type de la class fille et l'objet aura les methode de la class mère et de la fille.

```
// cleaningBot n'a que les methodes de la mère :
Robot cleaningBot = new CleaningBot

// cleaningBot2 a les methodes de la mère et la fille
CleaningBot cleaningBot2 = new Cleaning Bot
```
On cherche souvent a instancier au plus abstrait (class mère ou interface) pour pouvoir changer facilement de type de class si besoin et avoir plus de maneuvre lorsqu'on va utiliser les objets comme pararmetre de methode.

```
/**
*tous les types de robot peuvent etre utilisés
*comme parametres
*
public void move(Robot robot){
    System.out.println("I'm moving")
}

/**
*Seul les CleaningBot peuvent etre utilisés
*comme parametres
*
public void move(CleaningBot robot){
    System.out.println("I'm moving")
}
```



###### tags: `Java`