java - Java中的向上转换是否隐藏了子类的方法和字段?

标签 java upcasting

在我正在编写的程序中,我有一个类 RestrictedUser 和类 User 派生自 RestrictedUser。 我正在尝试通过转换为 RestrictedUser 来隐藏用户特定的方法,但是当我进行转换时,用户方法仍然可用。此外,当我运行调试器时,变量的类型显示为 User

RestrictedUser restricted = regularUser;

Java 中的向上转换是否隐藏了子类的方法和字段,还是我做错了什么?有解决方法吗?

谢谢

最佳答案

如果您尝试运行此代码:

User user = new User(...);
RestrictedUser restricted = user;
restricted.methodDefinedInTheUserClass(); // <--

你会得到一个编译错误。这在任何方面、形状或形式上都不安全,因为即使您将 RestrictedUser 传递给另一个方法,例如,该方法也可以这样做:

if (restricted instanceof User) {
    User realUser = (User)restricted;
    realUser.methodDefinedInTheUserClass(); // !!
}

并且您的“受限”用户不再受限。

对象在调试器中显示为 User 对象,因为它是 User 对象,即使对象引用存储在 RestrictedUser变量。基本上,将子类的实例放入具有父类类型的变量中确实会“隐藏”子类的方法和字段,但并不安全。

关于java - Java中的向上转换是否隐藏了子类的方法和字段?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/712528/

相关文章:

java - 读取属性文件失败

F# 向上转换基础

java - Java 中的向上转型和两个独立的对象属性

java - Java中错误和异常的区别?

java - 与maven集成后无法解析同一包中的类

java - ViewPager java.lang.OutOfMemoryError : bitmap size exceeds VM budget 错误

c++ - 如果不在纯虚拟基类中创建显式函数,就无法完成复制构造吗?

java - 对象在向上转型然后向下转型之后是否会丢失其属性值?

java - 重写 toString() 是否被视为多态?

java - 如何跨多个网站唯一标识同一用户?