java - 输出是什么?

标签 java inheritance

请解释一下下面的情况 输出是什么?


interface A{}
class B implements A{}
class C extends B{}
class D extends C{}
class E extends D{
public static void main(String args[]){
C c = new C();
B b = c;
A a = (E)c;
a = (B)c;
c = (C)(B)c;
}
}

最佳答案

完全严格地说,这不会编译,因为在第 4 行中您输入的是 Class 而不是 class

Class D extends C{}

然后你定义了两次ac

C c = new C(); // once
B b = c;
A a = (E)c;    // once a
A a = (B)c;    // twice c
C c = (C)(B)c; // twice

现在假设这些是拼写错误,输出将为 ClassCastException,因为 c 无法转换E .

当你执行强制转换时,就像你在说:“我是程序员,我知道这是一个......” ____(将你的类放在这里) 编译器将允许你编译。

但是,如果在运行时中,实例实际上并不是____(在本例中是E,但实际上不是),那么它将抛出ClassCastException

程序不会因A a = ( B ) c而失败;因为 cC 的实例,而 CB 的子类。

你可以说,C一个B。为了更好地理解它,请考虑以下声明:

class Employee extends Object {
}

每个Employee 都是一个 对象,因此转换会成功,实际上很明显它会成功,以至于您甚至不知道需要放置强制转换运算符()

 Employee e = new Employee();
 Object o = ( Object ) e; // or much better:
 Object o2 = e; // no cast needed when assigning to superclass. 

对象不一定是员工

 Object o = ....
 Employee e = ( Employee ) o; // will fail if o was not created as an Employee. 

这就是 A a = ( E ) c; 失败的原因,因为引用 c 不是创建为 E

希望对您有所帮助。

关于java - 输出是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3032953/

相关文章:

java - 无法使用 Hibernate EntityManager 绕过缓存

java - 如何修复意外的文档结束异常

c# - 继承 - 目标特定的继承类 C#

Java继承为什么这个toString打印BB而不是AB,AB?

javascript - 在Javascript中递归调用 "parent"构造函数?

java - Spring Boot 在 Debug模式下阻止 H2 控制台

java - MySQL 到 PostgreSQL 迁移 : mysql connector

java - 非静态变量列表不能从静态上下文中引用

javascript - 使用自定义按钮扩展 L.control.zoom

ruby-on-rails - 过滤器出现之前的顺序是什么?