当前位置: 首页 > 面试题库 >

Java从父类到子类的显式转换

丁阳羽
2023-03-14
问题内容
public class Animal {
    public void eat() {}
}

public class Dog extends Animal {
    public void eat() {}

    public void main(String[] args) {
        Animal animal = new Animal();
        Dog dog = (Dog) animal;
    }
}

分配Dog dog = (Dog) animal;不会产生编译错误,但在运行时会生成ClassCastException。为什么编译器无法检测到此错误?


问题答案:

通过使用强制转换,你实际上是在告诉编译器“相信我。我是专业人士,我知道我在做什么,我知道尽管不能保证,但是我告诉你这个animal变量肯定是会成为一只狗。”

由于动物实际上不是狗(它是动物,你可以做Animal animal = new Dog();,也可能是狗),因此VM在运行时会引发异常,因为你违反了这种信任(你告诉编译器一切都会好的,并且不!)

编译器比盲目地接受所有内容要聪明一些,如果你尝试将对象强制转换为不同的继承层次结构(例如,将Dog投射到String),则编译器会将其扔给你,因为它知道这种方法永远无法工作。

因为你实际上只是在阻止编译器抱怨,所以每次转换时,都必须检查是否在if语句中ClassCastException使用不会引起a (这一点很重要instanceof)。



 类似资料:
  • 我对Java语言中的类型化有一个误解。问题是ClassCastException。例如,在这段代码中,假设动物是Dog类的父类,

  • 问题内容: 有人可以解释以下原因的原因: 给我: 知道Java中short的最大值是32767正确吗? 问题答案: 根据您的价值1亿,我得到-7936。如果将1亿变为100万,我只能得到16960。 原因是值限制在-32768到+32767之间,并且Java在转换为a时仅保留最低有效16位(缩小的原始转换,JLS 5.1.3 )。有效地执行此操作:100万个mod 2 ^ 16(a中的16位)是1

  • 问题内容: 在Python中创建简单的对象层次结构时,我希望能够从派生类中调用父类的方法。在Perl和Java中,有一个用于此的关键字()。在Perl中,我可以这样做: 在Python中,似乎必须从子代中明确命名父类。在上面的示例中,我将不得不执行。 这似乎不正确,因为这种行为使创建深层次结构变得困难。如果孩子们需要知道哪个类定义了一个继承的方法,那么就会造成各种各样的信息痛苦。 这是python

  • 问题内容: 我想知道如何将某些函数返回的父对象转换为子类。 我不能更改A类。如果可以的话,我可以对A类实现functionIneed,但是由于代码的结构,这是不可能的。 问题答案: Python不支持“广播”。您将需要编写代码,以便它可以适当地进行初始化。

  • 我正在研究一个场景,其中有多个父类别,每个父类别都有多个子类别。 我已经设置了父类别来显示子类别,而不是产品。 下面是我当前的层次结构: 父类别1 子类别1 子类别2 子类别3 父类别2 子类别4 一切都很好,但我想做一件额外的事情,显示所有子类别的描述,当它们显示在父类别下。 我知道子类别的标题在查看父类别时默认显示,但是,我找不到一种方法来覆盖默认循环以显示父类别中子类别的描述。 任何帮助都将

  • 我正在修改open JDK以添加特性,我已经遇到了两次,但没有好的解决方案。