Maison > Java > javaDidacticiel > le corps du texte

Qu'est-ce que le polymorphisme Java ?

青灯夜游
Libérer: 2018-10-20 17:57:02
avant
3174 Les gens l'ont consulté

Ce que cet article vous apporte, c'est qu'est-ce que le polymorphisme Java ? L'utilisation du polymorphisme Java, à travers certaines fonctions du jeu, vous aidera à maîtriser l'utilisation du polymorphisme. Il a une certaine valeur de référence. Les amis dans le besoin peuvent s'y référer. J'espère qu'il vous sera utile.

Pourquoi utiliser le polymorphisme

Dans un jeu de combat (toutes similitudes sont purement fortuites), il y a deux héros mages différents : Xiao Qiao et Daji.
Les deux héros mages ont des méthodes d'attaque. Les dégâts d'attaque de Xiao Qiao sont de 10 et consomment 20 manas. Les dégâts d'attaque de Daji sont de 15 et consomme 30 manas. Les joueurs peuvent utiliser deux héros pour attaquer. Jetons un coup d’œil au code implémenté.

Classe Père - Héros : whyusepolymorphic.Hero.java

package whyusepolymorphic;

public class Hero {
    private int magicPoint;//魔法值
    private int hurt;//伤害
    private String name;//姓名
    
    public Hero(int magicPoint, int hurt, String name) {
        super();
        this.magicPoint = magicPoint;
        this.hurt = hurt;
        this.name = name;
    }

    public int getMagicPoint() {
        return magicPoint;
    }

    public void setMagicPoint(int magicPoint) {
        this.magicPoint = magicPoint;
    }
    
    //省略属性的 getter 和 setter 方法
}
Copier après la connexion

Sous-classe - Xiao Qiao : whyusepolymorphic.LittleJoe.java

package whyusepolymorphic;

public class LittleJoe extends Hero {

    public LittleJoe(int magicPoint, int hurt, String name) {
        super(magicPoint, hurt, name);
    }

    //攻击的方法
    public void attack() {
        System.out.println(this.getName()+" 发动攻击,伤害为:"+this.getHurt()
        +"。消耗 20的魔法值");
        this.setMagicPoint(getMagicPoint()-20);//魔法值-20
    }

}
Copier après la connexion

Sous-classe - Daji : whyusepolymorphic.Daji.java

package whyusepolymorphic;

public class Daji extends Hero{

    public Daji(int magicPoint, int hurt, String name) {
        super(magicPoint, hurt, name);
    }
    
    public void attack() {
        System.out.println(this.getName()+" 发动攻击,伤害为:"+this.getHurt()
        +"。消耗 30的魔法值");
        this.setMagicPoint(getMagicPoint()-30);//魔法值-30
    }
}
Copier après la connexion

Joueur : whyusepolymorphic.Player.java

package whyusepolymorphic;

public class Player {
    public void play(LittleJoe littleJoe) {
        littleJoe.attack();
    }
    public void play(Daji daji) {
        daji.attack();
    }
}
Copier après la connexion

Le code ci-dessus implémente complètement les fonctions requises, alors nous savons que les héros ne peuvent pas être seulement ces quelques-uns, si une nouvelle magie est ajoutée plus tard. Héros , les dégâts sont différents, que dois-je faire ?

Nous pouvons ajouter de nouvelles classes pour implémenter des méthodes d'attaque et modifier la classe du joueur pour ajouter des méthodes pour faire fonctionner les héros. Cette méthode peut répondre aux besoins d'expansion des héros, mais si d'autres héros sont ajoutés plus tard, elle ne nous sera pas si pratique à maintenir.

En étudiant le code ci-dessus, nous avons constaté que les paramètres de la méthode play dans la classe Player sont tous des sous-classes de la classe Hero. Une méthode play (Hero hero) peut-elle être utilisée pour faire fonctionner tous les héros ? Cette conception optimisée peut être obtenue en utilisant le polymorphisme.

Qu'est-ce que le polymorphisme

Succinctement, le polymorphisme est constitué de formes multiples. Les formes polymorphes du carbone dans la nature comprennent le graphite, le diamant, etc., et l'action de coupe comprend la coupe de papier, la coupe de cheveux, etc. La même opération produit des résultats différents en raison de conditions différentes.

Ensuite, le polymorphisme dans le programme fait référence au même type de référence, en utilisant différentes instances pour effectuer différentes opérations (la référence de classe parent spécifie l'objet de sous-classe Hero h=new Daji();).

Comment implémenter le polymorphisme

Étapes pour implémenter le polymorphisme :

1 Écrivez le parent et les sous-classes relation d'héritage

🎜>2.

La sous-classe remplace la méthode de la classe parent

3. Utilisez la référence de la

classe parent pour pointer vers l'objet de la sous-classe

le parent. la classe en tant que paramètres de méthode implémente le polymorphisme

Utiliser le polymorphisme pour optimiser le code ci-dessus

Modifier Hero.java pour ajouter des méthodes d'attaque

package whyusepolymorphic;

public class Hero {
    //省略属性和构造方法
    
    //攻击的方法
    public void attack() {
        System.out.println(this.getName()+" 发动攻击,伤害为:"+this.getHurt()
        +"。消耗 20的魔法值");
        this.setMagicPoint(getMagicPoint()-20);//魔法值-20
    }
    //省略 getter 和 setter 方法
}
Copier après la connexion
Pas besoin de modifier les deux sous-classes

Modifiez la classe du joueur Player.java et définissez les paramètres de la méthode de lecture sur la classe parent

package whyusepolymorphic;

public class Player {
    public void play(Hero hero) {
        hero.attack();
    }
}
Copier après la connexion
Modifiez la classe de test

package whyusepolymorphic;

public class TestPlay {
    public static void main(String[] args) {
        Player p=new Player();
        Hero daji=new Daji(100,15,"妲己");
        p.play(daji);
        System.out.println(daji.getName()+" 剩余魔法:"+daji.getMagicPoint());
        Hero littleJoe=new LittleJoe(100,10,"小乔");
        p.play(littleJoe);
        System.out.println(littleJoe.getName()+" 剩余魔法:"+littleJoe.getMagicPoint());
    }
}
Copier après la connexion
La classe parent est utilisée comme valeur de retour pour implémenter le polymorphisme

Les joueurs achètent des héros en utilisant le polymorphisme. La méthode d'achat a une valeur de retour et renvoie le héros acheté. La classe parent est utilisée comme valeur de retour pour implémenter cette fonction.

Modifiez la classe du joueur Player.java et ajoutez une méthode pour obtenir le héros

package whyusepolymorphic;

public class Player {
    public void play(Hero hero) {
        hero.attack();
    }
    
    public Hero getHero(int id) {
        if(1==id) {
            return new Daji(100,15,"妲己");
        }else if(2==id){
            return new LittleJoe(100,10,"小乔");
        }else {
            System.out.println("没有这个英雄");
            return null;
        }
    }
}
Copier après la connexion
Classe de test

package whyusepolymorphic;

import java.util.Scanner;

public class TestPlay {
    public static void main(String[] args) {
        Player p=new Player();
        System.out.println("欢迎来到英雄商店,请选择要购买的英雄:1.妲己2.小乔");
        Scanner input=new Scanner(System.in);
        int id=input.nextInt();
        Hero h=p.getHero(id);
        if(null!=h) {
            h.attack();
        }
    }
}
Copier après la connexion
Conversion de la classe parent en classe enfant

S'il existe des méthodes spécifiques à la sous-classe dans la sous-classe, la référence de la classe parent ne peut pas appeler les méthodes spécifiques à la sous-classe.

Ajouter une méthode queenWorship à Daji.java

package whyusepolymorphic;

public class Daji extends Hero{
    //省略构造方法及之前其他方法
    public void queenWorship() {
        System.out.println("释放大招:女王崇拜");
    }
}
Copier après la connexion
Ajouter une méthode dazzlingStar à LittleJoe.java

package whyusepolymorphic;

public class LittleJoe extends Hero {
    //省略构造方法及之前其他方法
    public void dazzlingStar() {
        System.out.println("释放大招:星华缭乱");
    }
}
Copier après la connexion
Ajouter une méthode bigMove à Player.java

package whyusepolymorphic;

public class Player {
    //省略构造方法及之前其他方法
    public void bigMove(Hero hero) {
        hero.dazzlingStar();
    }
}
Copier après la connexion
Code trouvé

Erreur signaléehero.dazzlingStar();

À ce stade, vous devez convertir la classe parent en sous-classe (conversion de type forcée)

Hero joe=new LittleJoe(100,10,"小乔");
Daji daji=(Daji) joe;
Copier après la connexion
Mais directement comme cette écriture signalera également une erreur. L'utilisation de l'opérateur instanceof peut garantir qu'il n'y aura pas d'erreurs de conversion

Syntaxe :

对象 instanceof 类或接口
Copier après la connexion
instanceof est généralement utilisée en conjonction avec une conversion de type forcée
Modifier Player.java La méthode bigMove dans

public void bigMove(Hero hero) {
        if (hero instanceof Daji) {
            ((Daji)hero).queenWorship();
        }else if(hero instanceof LittleJoe) {
            ((LittleJoe)hero).dazzlingStar();
        }
    }
Copier après la connexion
Écrivez le code de test dans la méthode principale

Player p=new Player();
p.bigMove(new LittleJoe(100,10,"小乔"));
p.bigMove(new Daji(100,15,"妲己"));
Copier après la connexion
Résumé : Ce qui précède est tout le contenu de cet article, J'espère que cela sera utile à l'apprentissage de chacun. Pour plus de didacticiels connexes, veuillez visiter le

Tutoriel vidéo Java, le Tutoriel graphique de développement Java, le Tutoriel vidéo bootstrap !

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Étiquettes associées:
source:cnblogs.com
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!