【发布时间】:2022-12-21 14:11:11
【问题描述】:
我正在创建一个大学管理系统,其中有一个数据库类,我在其中存储类 User 的 currentUser 对象。成功登录后,currentUser 对象变为 Student 或 Teacher 对象(它们是 User 的子对象)。但是当我尝试在 currentUser 对象上调用 Student 的方法时,它不起作用。
这是当前用户对象:
public static User currentUser;
所以 currentUser 没有初始化,我不想在这个阶段 downCast,
这是我授权用户的方式: `
if(student.getLogin().equals(login) && student.getPassword().equals(password)) {
currentUser = student;
isLogedIn = true;
}
`
我尝试像这样将 User 类型转换为 Student : `
currentUser = student;
currentUser = (Student) currentUser;
` 但我仍然无法在 currentUser 上调用 Student 方法。我该如何解决?
【问题讨论】:
-
您需要引入一个新变量,其类型为您要使用的变量:
Student student = (Student) currentUser;,然后您可以在其上调用 Student 方法。或者在不声明像((Student) currentUser).someMethodOfStudent();这样的新变量的情况下内联它 你永远不能调用User currentUser上不属于类User的任何方法,只要它被声明为User。 -
有什么方法可以将 Student 对象存储到初始 User 变量中?
-
转换并不神奇,也不会改变对象本质上是什么,只是编译器认为它是什么。您应该为您的类提供复制构造函数,以便可以从旧对象创建适当类的新对象。
-
如果演员阵容有效(我假设)那么你已经做到了。如果对象已经不是 Student,则无法进行转换。我想问您的问题是,如果您似乎总是想使用
Student及其方法,为什么还要将类型声明为User?为什么不Student currentUser如果你的所有用户都是学生,那么就省去所有的麻烦吧?
标签: java oop inheritance casting