您需要了解IS-A关系。让我们讨论一个员工和经理关系的例子。
class Employee{
public Employee(){
System.out.println("Employee obj");
}
}
class Manager extends Employee{
public Manager(){
System.out.println("Manager obj");
}
}
通过扩展Employee,我们将Manager声明为Employee的专业化。因此,每个Manager都是Employee但每个Employee都不是Manager。
Employee类型的引用可以引用满足IS-A关系的对象。因此,这些写法是完全合法的:
Employee emp1 = new Employee();
Employee emp2 = new Manager();
但是,如果我们尝试写
Manager man1 = new Employee(); //Wrong: Compilation error.
这违反了IS-A关系。因此,我们得到编译时错误。为了避免这种编译错误,我们需要向类型Manager添加强制转换。但是,转换为类型Manager只能避免编译问题。由于这种类型的转换,您将获得java.lang.ClassCastException 。
Manager man1 = (Manager) new Employee(); //Wrong: avoids compilation error but will generate a ClassCastException at runtime.
我建议您阅读Java 语言规范:第 5.5.1 节,以全面了解强制转换引用类型。