java - 作为父类(super class)返回时子类数据的安全性

标签 java polymorphism return-type

当您在 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/

相关文章:

java - 添加到 ArrayList 时是否会转换对象?

c++ - Thrust 中的虚方法调用

c# - 返回不同类型时是否建议使用多种方法?

java - 为什么这个带有赋值和相等检查的 if 语句评估为假?

java - 创建一个可以处理所有类型的 CRUD 操作的类。每次我需要执行 CRUD 时,无需创建 SessionFactory 或 Session 对象

java - Spring RestTemplate 将响应流式传输到另一个请求中

C 当返回 long 时,程序的行为就像我返回 int

java - Tomcat 6 是否支持 Java 8

Java泛型参数和继承

java - 从泛型函数返回泛型类型