当前位置: 首页 > 知识库问答 >
问题:

为什么我的ArrayList只打印最后一个被调用的子类?[重复]

施永贞
2023-03-14

我目前正在学习Java中的多态性,任务的一部分是创建一个程序,使用继承和多态性打印出各种子类。我试图寻找解决方案,但似乎找不到其他人遇到这个问题。

下面是一段代码,应该分别打印AlexAlexa。然而,输出是,AlexaAlexa

我已经尝试过使用Eclipse进行调试,但我无法确定错误是什么。在这一点上我真的很困惑,过去一周我一直在尝试这个问题,但没有结果。如果这是一个简单的问题,请原谅我,但我不知道出了什么问题。我真的很感激任何帮助!

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个答案

单于经纬
2023-03-14

这是因为您已经将name定义为一个静态字段。所以在每个对象中,它将具有相同的值。只需从name中删除静态

protected String name;

当变量、方法。。。定义静态,无需创建对象即可访问它。同时,它在每个对象中具有相同的值。因此,如果修改静态变量,它将保留最后一次修改。

有关更多信息,请查看此链接。

华懿轩
2023-03-14

每个人都有自己的名字,不管是男人还是女人。

所以从中删除静态关键字

protected static String name;
令狐跃
2023-03-14

这里有几件事是错的:

>

您正在打印错误的name。您想要打印传递到print()中的实例name。所以您需要这样的东西(您可以为name创建一个getter方法):

static void print(Human human) {
    System.out.println(human.getName());
}
 类似资料:
  • 问题内容: 我是新手,我正在尝试调用UISwitch IBAction中要求本地通知的多个函数。我想在某个日期(一年中的每个季度第4、7、10、1个)发送通知。只有第四个季度函数被调用。如何获得全部四个功能?这是我的代码: // UISwitch用于季度通知 //四个季度的功能 问题答案: 我认为您使用的是+ iOS10,并且使用的是UserNotifications框架,对吗? 您的很有可能具有

  • 我正在使用Hibernate JPA运行本机查询并返回结果列表。 我想要获取的结果列表并添加到映射中以供将来处理,但是返回的映射仅包含ResultList中的最后一项。 如何让结果列表在地图中添加多个条目? --编辑-- 预期地图内容: 940 7107877 940 7107664 940 7112778 940 7112479 940 7114678 940 7113504 println输出

  • 问题内容: 我正在尝试将名为 City 的 类的 对象添加到中。这是该类的代码 __ 这是我的 主班 的代码 __ 的结果始终相同,并且似乎 数组列表 仅存储添加到其所有元素中的最后一个对象。 例如,运行程序时得到的结果是: 为什么我得到那个结果?我该如何解决? 提前致谢! 问题答案: 在和变量被标记为。甲构件跨过的所有实例共享,并且因此是一个全局变量。您需要对代码进行几处更改: 将city中的和

  • 问题内容: 为什么我添加到ArrayList中对象只包N个最后一个元素? 问题答案: 此问题有两个典型的原因: 你存储在列表中的对象使用的静态字段 意外将同一对象添加到列表 静态场 如果列表中的对象将数据存储在静态字段中,则列表中的每个对象将看起来是相同的,因为它们具有相同的值。考虑下面的类: 在该示例中,由于声明了,因此在所有实例之间只有一个共享。(请参阅“了解班级成员”教程。) 如果使用以下代

  • 目前控制台打印循环中的所有值,但只需要打印最后一个

  • 我试图在一个Jasper报告中显示多个表,我使用子报告来实现这个功能。但我一直在显示几个子报告。实际上,只显示其中一个(第一个)。 以下是我的主report.jrxml: 下面是subjectSubreport.jrxml: 这是printersSubreport.jrxml: 当我切换子报告时,第一个报告正确显示,另一个报告消失。在JasperSoft Studio中,一切都很好,当我将它们导出