Héritage et polymorphisme en Java

View more Tutorials:

1- Introduction

Héritage et polymorphisme - c'est un concept très important en Java. Vous devez les comprendre mieux si vous souhaitez apprendre java.

2- Classe, Contructor et instance

Vous devriez comprendre explicitement la classe, le constructeur (constructor) et l'instance avant de commencer à apprendre l'héritage dans java. Nous considérons la classe de Person décrit une personne avec des informations sur le nom complet, l'année de naissance, lieu de naissance.
Person.java
package org.o7planning.tutorial.inheritance.basic;

public class Person {

	// Nom de champ- nom de personne.
	private String name;
	// Champ bornYear - l'année de naissance
	private Integer bornYear;
	// Champ placeOfBirth - lieu de naissance.
	private String placeOfBirth;

	// Constructeur comprend trois paramètres.
	// L'objectif est d'attribuer des valeurs aux champs de Personne.
	// Indiquer le nom, l'année de naissance, le lieu de naissance d'une personne.
	public Person(String name, Integer bornYear, String placeOfBirth) {
		this.name = name;
		this.bornYear = bornYear;
		this.placeOfBirth = placeOfBirth;
	}

	// Constructeur comprend deux paramètres
	// L'objectif est d'attribuer des valeurs aux deux champs de nom et l'année de naissance pour la Personne
	// Le lieu de naissance n'est pas assigné.
	public Person(String name, Integer bornYear) {
		this.name = name;
		this.bornYear = bornYear;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public Integer getBornYear() {
		return bornYear;
	}

	public void setBornYear(Integer bornYear) {
		this.bornYear = bornYear;
	}

	public String getPlaceOfBirth() {
		return placeOfBirth;
	}

	public void setPlaceOfBirth(String placeOfBirth) {
		this.placeOfBirth = placeOfBirth;
	}
}
PersonDemo.java
package org.o7planning.tutorial.inheritance.basic;

public class PersonDemo {

	public static void main(String[] args) {

		// Instance: Thomas Edison.
		Person edison = new Person("Thomas Edison", 1847);

		System.out.println("Info:");
		System.out.println("Name: " + edison.getName());
		System.out.println("Born Year: " + edison.getBornYear());
		System.out.println("Place Of Birth: " + edison.getPlaceOfBirth() );

		// ​​​​​​​
		// Instance: Bill Gates
		Person billGates = new Person("Bill Gate", 1955, "Seattle, Washington");

		System.out.println("Info:");
		System.out.println("Name: " + billGates.getName());
		System.out.println("Born Year: " + billGates.getBornYear());
		System.out.println("Place Of Birth: " + billGates.getPlaceOfBirth());

	}

}

Distinguer laclasse,  le constructeur et l'instance :

Personne simule une classe de personnes, c'est quelque chose abstraite mais elle a des informations, dans l'exemple ci-dessus, qui sont le nom, l'année de naissance, le lieu de naissance.

Constructeur
  • Constructeur adopte toujours le même nom que la classe
  • Une classe contient un ou plusieurs constituants
  • Constructeur avec ou sans paramètres, le constructeur qui n'a pas de paramètre est appelé constructeur par défaut.
  • Constructeur est le moyen de créer un objet de la classe.
Donc la classe Person (Décrit la classe personne ) est quelque chose abstraite, mais lorsqu'elle est spécifié pour vous ou moi, c'est deux  objets (instance) de la classe Person. Et les constructeurs sont des méthodes particulières pour créer des objets, des composants seront assignés des valeurs aux champs (field) de la classe pour l'objet ..

Voyez l'illustration, initialisez l'objet (instance) de Constructor.

3- Héritage en java

Nous avons besoin de quelques classes qui participent à des exemples.
  • Animal: Classe simule un animal.
  • Canard: Classe simule un canard, est une sous-classe de Animal.
  • Chat: Classe simule un chat, est une sous-classe de Anima
  • Souris: Classe simule un souris, est une sous-classe de Animal.
Ici, nous avons la classe Animal, avec une méthode sans contenu.
  • public abstract String getAnimalName();
Cette méthode est une méthode abstraite, dans la sous-classe, vous derivez déclarer et implémenter son contenu. Cette méthode doit renvoyer le nom de l'espèce animale
La classe Animal contient au moins une méthode abstraite et elle doit être déclarée comme abstraite. La classe abstraite a un constructeur mais vous ne pouvez pas créer des instances via ce constructeur.
  • En substance, si vous voulez créer un objet d'animal, vous devriez créer à partir d'une espèce animale spécifique, dans ce cas, vous devez initialiser à partir du constructeur de Cat, de Mouse ou de Duck.
Animal.java
package org.o7planning.tutorial.inheritance.animal;

// La classe comprend au moins une méthode abstraite qui doit être déclarée abstraite.
public abstract class Animal {

	// Le nom, par exemple, Tom Chat, Jerry Souris..
	private String name;

	// Constructeur par défaut.
	public Animal() {
		// Assigner la valeur par défaut pour le 'name'
		this.name = this.getAnimalName();
	}

	public Animal(String name) {
		this.name = name;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	// C'est une méthode abstraite.
	// Renvoyer le nom de cet animal.
	// Le contenu spécifique de cette méthode sera mise en œuvre (implemented) dans la sous-classe.
	public abstract String getAnimalName();

}
Ensuite, observez la classe Cat , hérité de Animal.
Cat possède également son constructeur et a également ses champs. Dans la première ligne du constructeur, il faut toujours appeler super(..), signifie que l'appel au constructeur de la classe mère, pour initialiser la valeur aux champs de la classe mère.

 Si vous n'appelez pas super(..), Java insère automatiquement super(..) e n première ligne du constructeur au moment de la compilation.
Cat.java
package org.o7planning.tutorial.inheritance.animal;

public class Cat extends Animal {

	private int age;
	private int height;

	public Cat(int age, int height) {
		// Appeler le Constructeur par défaut de la classe mère (Animal).
		// Afin d'assigner des valeurs aux champs de superclasse.
		super();
		// Ensuite, assigner des valeurs à ses champs (field).
		this.age = age;
		this.height = height;
	}

	public Cat(String name, int age, int height) {
		// Appeler le Constructeur par défaut de la classe mère (Animal).
		// Afin d'assigner des valeurs aux champs de superclasse.
		super(name);
		// Puis, assigner des valeurs à ses champs (field).
		this.age = age;
		this.height = height;
	}

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}

	public int getHeight() {
		return height;
	}

	public void setHeight(int height) {
		this.height = height;
	}

	// Implémenter (implement) la méthode abstraite déclarée dans la classe mère.
	@Override
	public String getAnimalName() {
		return "Cat";
	}

}
Lorsque vous créez un objet Cat, qu'est-ce qui se passe?

Voyez la classe de la Mouse, sous classe de Animal.
Voir la classe de la souris, sous-classe de Animal.

 

Mouse.java
package org.o7planning.tutorial.inheritance.animal;

public class Mouse extends Animal {

	private int weight;

	// Constructeur par défaut .
	public Mouse() {
		// Gọi tới cấu tử Mouse(int)
		// Call to constructor Mouse(int)
		this(100);
	}

	// Constructeur a un paramètre.
	public Mouse(int weight) {
		// Si vous n'appelez pas de super(...).
		// Java appellera un super() par défaut.
		// super();
		this.weight = weight;
	}

	// Constructeur a deux paramètres.
	public Mouse(String name, int weight) {
		super(name);
		this.weight = weight;
	}

	public int getWeight() {
		return weight;
	}

	public void setWeight(int weight) {
		this.weight = weight;
	}

	@Override
	public String getAnimalName() {
		return "Mouse";
	}
}
InstanceofDemo.java
package org.o7planning.tutorial.inheritance.demo;

import org.o7planning.tutorial.inheritance.animal.Animal;
import org.o7planning.tutorial.inheritance.animal.Cat;
import org.o7planning.tutorial.inheritance.animal.Mouse;

public class InstanceofDemo {

	public static void main(String[] args) {

		// Créer un objet animal.
		// L'objet animal est une classe abstraite,
		// vous ne pouvez pas créer un objet de Constructeur de Animal.
		Animal tom = new Cat("Tom", 3, 20);

		System.out.println("name: " + tom.getName());
		System.out.println("animalName: " + tom.getAnimalName());

		// Utiliser l’opérateur « instanceof » pour vérifier
		// si un objet est une instance d'une classe spécifique.
		boolean isMouse = tom instanceof Mouse;
		System.out.println("Tom is mouse? " + isMouse);

		boolean isCat = tom instanceof Cat;
		System.out.println("Tom is cat? " + isCat);

		boolean isAnimal = tom instanceof Animal;
		System.out.println("Tom is animal? " + isAnimal);

	}

}
Les résultats de l'exécution d'exemple :

InheritMethodDemo.java
package org.o7planning.tutorial.inheritance.demo;

import org.o7planning.tutorial.inheritance.animal.Cat;

public class InheritMethodDemo {

	public static void main(String[] args) {

		// Créer une instance de Cat.
		Cat tom = new Cat("Tom", 3, 20);

		// Appeler les méthodes héritées de la classe mère (Animal).
		System.out.println("name: " + tom.getName());
		System.out.println("animalName: " + tom.getAnimalName());

		System.out.println("-----------------");

		// ​​​​​​​
		// Appeler les méthodes déclarées dans la classe Cat.
		System.out.println("Age: " + tom.getAge());
		System.out.println("Height: " + tom.getHeight());
	}

}
Les résultats de l'exécution d'exemple :

Casting en Java
CastDemo.java
package org.o7planning.tutorial.inheritance.demo;

import java.util.Random;

import org.o7planning.tutorial.inheritance.animal.Animal;
import org.o7planning.tutorial.inheritance.animal.Cat;
import org.o7planning.tutorial.inheritance.animal.Mouse;

public class CastDemo {

	// Cette méthode renvoie un animal aléatoire.
	public static Animal getRandomAnimal() {
		// Renvoie une valeur aléatoire 0 ou 1.
		int random = new Random().nextInt(2);

		Animal animal = null;
		if (random == 0) {
			animal = new Cat("Tom", 3, 20);
		} else {
			animal = new Mouse("Jerry", 5);
		}
		return animal;
	}

	public static void main(String[] args) {

		Animal animal = getRandomAnimal();

		if (animal instanceof Cat) {
			// Presse le type (cast) au type Cat
			Cat cat = (Cat) animal;

			// Et appèlle une méthode de la classe Cat.
			System.out.println("Cat height: " + cat.getHeight());
		} else if (animal instanceof Mouse) {
			// Presse le type (cast) au type Mouse.
			Mouse mouse = (Mouse) animal;

			// Et appèlle une méthode de la classe Mouse.
			System.out.println("Mouse weight: " + mouse.getWeight());
		}

	}

}

4- Polymorphisme en Java

Vous avez un chat originaire d'Asie ( AsianCat), on peut l'appeler c'est un chat (Cat) ou dire que c'est un animal (Animal) qui est rend du polymorphisme.

Sur votre CV, il est écrit que vous êtes asiatique, alors que vous êtes vietnamien.

L'exemple ci-dessous vous montre comment comporter entre la déclaration et la réalité

La classe AsianCat est une classe héritée de la classe  Cat . 
AsianCat.java
package org.o7planning.tutorial.inheritance.animal;

public class AsianCat extends Cat {

	public AsianCat(String name, int age, int height) {
		super(name, age, height);
	}

	// Redéfinir (override) la méthode de la classe mère (Cat)
	@Override
	public String getAnimalName() {
		return "Asian Cat";
	}
}
Le polymorphisme de Java est expliqué dans l'illustration ci-dessous :
PolymorphismDemo.java
package org.o7planning.tutorial.polymorphism;

import org.o7planning.tutorial.inheritance.animal.AsianCat;
import org.o7planning.tutorial.inheritance.animal.Cat;

public class PolymorphismDemo {

  public static void main(String[] args) {

      Cat cat1 = new Cat("Tom", 3, 20);

      Cat cat2 = new AsianCat("ATom", 2, 19);

      System.out.println("Animal Name of cat1: " + cat1.getAnimalName());

      System.out.println("Animal Name of cat2: " + cat2.getAnimalName());

  }

}
Les résultats de l'exécution d'exemple :

View more Tutorials: