当您在 Java 中的父类(super class)类型的方法中返回子类时,我在查找具体情况时遇到了一些麻烦。例如:
public class SuperClass
{
int a;
}
public class SubClass extends SuperClass
{
int b;
}
SuperClass superObj;
SubClass subObj;
private SuperClass getObject ()
{
return subObj;
}
public static void main (...)
{
superObj = getObject();
}
当 subObj 作为其父类(super class)返回时,它到底发生了什么?我意识到在输入这个示例时,我可能可以自己轻松地测试它,但我仍然很好奇发生这种情况时的过程到底是什么,以及它是否被认为是好的(如果有效的话)或坏的做法.
我这么问是因为我目前正在开发一个项目,其中我有两个抽象基类,每个基类都有几个子类。我试图找出好/坏的方法来处理必须从一个子类更改为另一个子类的情况,同时仍然使用使用抽象基类时添加的便利多态性。
编辑:我修复了 main 和类声明,对此感到抱歉。
最佳答案
转换不会从根本上将对象更改为不同的类型,它只是告诉编译器将对象视为其父类(super class)(或向下转换时的子类)。在您的示例中,superObj 仍然是 SubClass 类型的实例,但它现在似乎是一个 SuperClass。这意味着,如果您尝试引用 superObj.b,您将收到编译错误(因为 SuperClass 中不存在 b)。但是您可以引用(SubClass)superObj.b
。在这种情况下,您告诉编译器将 subClass 视为 SubClass 的实例(它确实是)。
让我们更进一步,向您的代码中添加另一个类:
public class SisterClass extends SuperClass
{
int c;
}
在不更改代码中任何其他内容(语法问题除外)的情况下,您尝试引用 ((SisterClass)superObj)
。这将编译但会失败并出现 ClassCastRuntime 运行时错误。虽然 SisterClass 是 SuperClass 的子类,但 superObj 并不是 SisterClass 的实例。因此,您只能转换为对象实际。
关于java - 作为父类(super class)返回时子类数据的安全性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17863102/