[Java] Polymorphisme

Qu'est-ce que le polymorphisme?

Shape.java


public class Shape {
  protected double width;
  protected double height;

  public Shape(double width, double height) {
    this.width = width;
    this.height = height;
  }
//Récupère l'aire de la figure (remplacement dans la classe dérivée)
  public  double getArea() {
    return 0d;
  }
  //public abstract double getArea();
}

Triangle.java


public class Triangle extends Shape {
  public Triangle(double width, double height) {
    super(width, height);
  }
//Obtenez l'aire d'un triangle
  @Override
  public double getArea() {
    return this.width * this.height / 2;
  }
}

Rectangle.java


public class Rectangle extends Shape {
  public Rectangle(double width, double height) {
    super(width, height);
  }
//Obtenez la superficie de la place
  @Override
  public double getArea() {
    return this.width * this.height;
  }
}
public class PolymorphismBasic {
  public static void main(String[] args) {
    //Attribuer un objet de type Triangle (upcast)
    Shape tri = new Triangle(10, 50);
    //Attribuer un objet de type Rectangle (upcast)
    Shape rec = new Rectangle(10, 50);
    System.out.println(tri.getArea()); //250.0
    System.out.println(rec.getArea()); //500.0
  }
}

Méthode abstraite

Comment utiliser

Shape.java


public abstract class Shape {
  protected double width;
  protected double height;

  public Shape(double width, double height) {
    this.width = width;
    this.height = height;
  }
 //Vous ne pouvez pas avoir de contenu dans la classe de base!
  public abstract double getArea();
}

interface

Définition d'interface

public interface Shape {
  double getArea();
}

Membre définissable

Implémentation de l'interface

//Classe d'implémentation d'interface de forme
public class Rectangle implements Shape {
  private double width;
  private double height;

  public Rectangle(double width, double height) {
    this.width = width;
    this.height = height;
  }

  @Override
  public double getArea() {
    return this.width * this.height;
  }
}

Membre de l'interface

Champ constant

interface MyApp{
    String TITLE = "Chevaliers des oiseaux immortels";
    double NUMBER = 5;
}

champ statique (Java 8 ou version ultérieure)

méthode par défaut (Java 8 ou version ultérieure)

public interface Loggable {
  default void log(String msg) {
    System.out.println("Log: " + msg);
  }
}
//Ne remplacez pas la méthode de journalisation
public class LoggableImpl implements Loggable {
}

InterfaceDefault.java


public class InterfaceDefault {

  public static void main(String[] args) {
    var l = new LoggableImpl();
    //La méthode par défaut de la classe Loggable est appelée
    l.log("Harry Potter"); //Log:Harry Potter
  }
}
//Ne remplacez pas la méthode de journalisation
public class LoggableImpl implements Loggable {
  @Override
  public void log(String msg) {
    Loggable.super.log(msg);
    System.out.println("LogImpl: " + msg);
  }
}

InterfaceDefault.java


public class InterfaceDefault {

  public static void main(String[] args) {
    var l = new LoggableImpl();
    l.log("Harry Potter"); 
    //Log:Harry Potter
    //LogImpl:Harry Potter
  }
}

Remarque sur l'héritage multiple

Méthode abstraite en double

public interface IHoge {
  void foo();
  //CharSequence foo(); //OK
}
public interface IHoge2 {
  String foo();
}
public class HogeImpl implements IHoge, IHoge2 {
    @Override
    public String foo() { } //Le type de retour est IHoge.foo()Non compatible avec
}

Dupliquer les champs constants

public interface Hoge {
  int DATA = 0;
}
public interface Hoge2 {
  String DATA = "This is an apple.";
}
public class HogeImpl implements Hoge, Hoge2 {
  public void foo() {
    System.out.println(DATA); //Erreur
  }
}

Dupliquer la méthode par défaut

public interface DHoge {
  default void log(String msg) {
    System.out.println("DHoge: " + msg);
  }
}
public interface DHoge2 {
  default void log(String msg) {
    System.out.println("DHoge2: " + msg);
  }
}
public class HogeImpl implements DHoge, DHoge2 {
  @Override
  public void log(String msg) {
    DHoge.super.log(msg); //Erreur (le journal de méthode par défaut en double avec String est DHoge2,(Hérité de DHoge)
    //IHoge.super.log(msg); //La référence explicite est OK
  }
}

Lequel utiliser, interface ou classe abstraite?

Recommended Posts

[Java] Polymorphisme
java (polymorphisme)
Polymorphisme
À propos du polymorphisme Java Super ()
java (mérites du polymorphisme)
Java
Java
Polymorphisme
Apprendre Java (0)
Étudier Java ―― 3
[Java] tableau
Quiz sur le polymorphisme
Java protégé
[Java] Annotation
Module [Java]
Tableau Java
Étudier Java ―― 9
Java scratch scratch
Astuces Java, astuces
Méthodes Java
Méthode Java
java (constructeur)
Tableau Java
java (remplacement)
java (méthode)
Journée Java 2018
Chaîne Java
Java statique
Sérialisation Java
java débutant 4
JAVA payé
Étudier Java ―― 4
Java (ensemble)
[Java] compareTo
Étudier Java -5
java réfléchissant 获 获 举
java (interface)
Mémorandum Java
Tableau Java
[Java] Array
Étudier Java # 0
Revue Java
framework java
Fonctionnalités Java
[Java] Héritage
FastScanner Java
À propos du polymorphisme
Fonctionnalités Java
java débutant 3
Mémo Java
java (encapsulation)
Héritage Java
[Java] Surcharge
Les bases de Java
Décompiler Java
[Java] Annotation
note java
java débutant
Java (add2)
JAVA (Carte)