java - 向上转型向下转型

标签 java inheritance

我有一个父类 class A 和一个子类 class C extends A

A a=new A();
C c=(C)a;

这给了我错误。为什么?

另外如果我的代码是

A a=new A();
C c=new C();
c=(C)a;

这很好用。

现在我的c 变量可以访问哪些方法..C 中的方法还是B 类中的方法?

最佳答案

它给你一个错误,因为 a 不是 C 的实例 - 所以你不能向下转换它。想象一下,如果允许这样做, - 您可以:

Object o = new Object();
FileInputStream fis = (FileInputStream) o;

当您尝试从流中读取时,您期望发生什么?您希望它读取什么文件?

第二部分:

A a=new A();
C c=new C();
C c=(C)a;

这将 正常工作——一开始它甚至不会编译,因为你声明同一个变量 (c) 两次;如果您修复了该错误,当您尝试将 A 的实例转换为 C 时,您仍然会得到一个异常。

然而,这段代码是真正有效的:

A a = new C(); // Actually creates an instance of C
C c = (C) a; // Checks that a refers to an instance of C - it does, so it's fine

关于java - 向上转型向下转型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7489619/

相关文章:

.net - 如何密封被覆盖的属性(property)

java - 如何继承/使用多个类的方法

c++ - 三法则与继承

c++ - 派生类调用基类中的模板函数时的链接问题

java - Wildfly 15 从 jax rs 登录用户获取 Singleton 中的 EJBContext

java - 使用 BufferedReader 和 FileReader 从文件中读取

java - 如果 @SuppressWarnings 抑制的 Checkstyle 规则违规未抑制任何内容,则发出警告

java - 字符串表现不稳定的简单日期格式

java - 使用 parseDouble 检查 null 的更短方法?

java - Java中的继承和静态成员