0
votes

Pourquoi mon arrayliste imprimait-il uniquement la dernière sous-classe appelée?

Je suis actuellement en train d'apprendre un polymorphisme en Java et une partie de la mission consistait à créer un programme imprimer diverses sous-classes en utilisant l'héritage et le polymorphisme. J'ai essayé de chercher des solutions, mais je ne pouvais pas sembler trouver quelqu'un d'autre que ce problème.

ci-dessous est un morceau de code qui est censé imprimer alex code> et alexa code > respectivement. Cependant, la sortie est, à la place, alexa code> alexa code>. P>

J'ai essayé de déboguer en entrant à l'aide d'Eclipse, mais je ne peux pas identifier ce qui est l'erreur. Je suis vraiment excitée à ce stade, j'ai essayé cette question de la semaine dernière, mais sans être disponible. S'il vous plaît, pardonnez-moi s'il s'agit d'une question simple mais je ne peux pas comprendre ce qui s'est mal passé. J'apprécierais vraiment toute aide! P>

import java.util.ArrayList;
public class Human {
   protected static String name;

   public Human(String name) {
       System.out.println("In human constructor");
       this.name = name;
   }
   void greetings() {}

   static void print(Human human) {
       System.out.println(name);
   }

   public static void main(String[] args) {
       ArrayList<Human> human = new ArrayList<Human>();
       human.add(new Man("Alex"));
       human.add(new Woman("Alexa"));
       for (int i = 0; i < human.size(); i++) {
           print(human.get(i));
       }
   }
}

class Man extends Human {

   public Man(String name) {
       super(name);
       // TODO Auto-generated constructor stub
   }

}

class Woman extends Human {

   public Woman(String name) {
       super(name);
       // TODO Auto-generated constructor stub
   }

}


3 commentaires

Retirez le nom statique de la chaîne statique protégée;


Une variable statique n'appartient pas à une instance spécifique; Il est plutôt courant pour toutes les instances. C'est pourquoi vous avez changé de valeur chaque fois que sa valeur sera modifiée pour toutes les instances.


@Arvind Kumar Avinash Merci pour la clarification!


4 Réponses :


1
votes

Faites des recherches sur le contexte statique. Voici une partie de votre problème:

public class Test {
    public static void main(String[] args) {
        Human human = new Human("Steve");

        System.out.println(human.getName());
    }
}

class Human {
    private String name;

    Human(String s) {
        this.name = s;
    }

    public String getName() {
        return this.name;
    }
}


4 commentaires

Cela ne fera que fixer une partie du problème ...


Vous vous trompez, il n'imprimera pas les noms corrects. Essayez-le ...


nom sera null ...


@ BRSO05 whoops, je pensais humain était un pojo mais il contient le principal - je suis corrigé.



1
votes

Chaque humain a son propre nom, peu importe si l'homme ou la femme.

alors retirez le mot clé statique de xxx


1 commentaires

Cela ne fera que fixer une partie du problème ...



1
votes

Ceci est parce que vous avez défini nom en tant que champ statique. Donc, dans chaque objet, il aura la même valeur. Il suffit de supprimer le statique du nom. xxx

Lors d'une variable, une méthode, ... est définie statique , vous pouvez avoir accès à il sans créer des objets. En attendant, il aura la même valeur dans chaque objet. Donc, si vous modifiez une variable statique, il conservera la dernière modification.

Regardez sur Ce lien pour plus d'informations.


1 commentaires

Cela ne fera que fixer une partie du problème ...



2
votes

Il y a quelques choses mal ici:

  1. nom code> ne doit pas être statique. Vous souhaitez une instance de nom code> pour chaque instance (objet) créée. P> li>

  2. Vous imprimez le mauvais nom code>. Vous souhaitez imprimer le nom code> de l'instance passée dans Imprimer () code>. Donc, vous voudriez quelque chose comme ça (vous créeriez une méthode getter pour nom code>): p> li> OL>

    static void print(Human human) {
        System.out.println(human.getName());
    }
    


2 commentaires

Pourquoi passeriez-vous un humain à elle-même pour vous imprimer? Pourquoi ne voudriez-vous pas simplement faire void print () {system.out.println (ce nom)} et l'appelez avec yourhuman.print () ? La façon dont vous l'avez maintenant, ce n'est pas statique pour que vous exigeiez une instance de humain pour imprimer un différent humain ce qui n'a aucun sens. Soit avoir statique avec un paramètre humain ou le fait pas statique sans paramètre


@NExevis vous êtes correct