【问题标题】:I try to use polymorphism but my code does not work as i excpected, could anyone help me solve this problem?我尝试使用多态性,但我的代码不能像我预期的那样工作,有人可以帮我解决这个问题吗?
【发布时间】:2021-07-27 20:41:34
【问题描述】:

UserManager.java:

public class UserManager {
        public void add(User user) {
            System.out.println(user.getUserNumber() + " user added");
        }
}

StudentManager.java:

public class StudentManager extends UserManager {
    @Override
    public void add(User user) {
        System.out.println(user.getUserNumber() + "  student added");
    }
}

Main.java:

public class Main {
    public static void main(String[] args) {
        Student student1 = new Student();
        student1.setUserNumber("12345");

        UserManager userManager = new UserManager();       
        userManager.add(student1);

    }
}
    

预期输出:已添加 12345 名学生。

实际输出:12345 个用户添加。

为什么我得到这个输出?

【问题讨论】:

  • 您创建了一个UserManager 实例,因此调用了UserManager 方法。这是预期的行为。你有没有故意做UserManager userManager = new StudentManager();
  • 当您使用Student 对象调用UserManager 时,Java 不会神奇地选择您的StudentManageruserManager 实例必须是@ 的实例987654331@
  • new UserManager()改成new Studentmanager()
  • 如果你想要@Lino 提到的神奇功能,你必须使用访问者设计模式。
  • “预期输出:12345 学生已添加” - 您能否具体说明您期望该输出的原因?断言“X 必须为真,因为 Y 为真”是一个相当标准的调试过程,然后检查您的代码以查看 Y 是否真的为真。在你的情况下,你可能会发现它不是。例如,您可能期望该输出,因为您使用的是StudentManager 实例。但是检查您的代码会发现您在任何地方都没有使用StudentManager 实例。

标签: java class inheritance polymorphism extend


【解决方案1】:

如果您想按预期使用多形性,您应该将UserManager 对象实例化为StudentManager,因此JVM 将调用覆盖的add 方法。以下是正确的做法:

public class Main {
   public static void main(String[] args) {
       Student student1 = new Student();
       student1.setUserNumber("12345");

       UserManager userManager = new StudentManager();       
       userManager.add(student1);
   }
}

【讨论】:

  • @Lukasz 感谢您的编辑,实际上我在提交答案时注意到格式错误,并且我已经进行了编辑。无论如何谢谢:)
猜你喜欢
  • 2023-03-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-28
相关资源
最近更新 更多