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

Java继承下降ClassCastException

赵元白
2023-03-14
问题内容

给定以下代码,我有一个问题:

class A{}
class B extends A {}
class C extends B{}

public class Test {
    public static void main(String[] args) {
        A a = new A();
        A a1=new A();
        B b = new B();
//        a=b;// ok
//        b=(B)a;// ClassCastException
//        a=(A)a1;  // ok
//        a=a1;  // ok

        a=(B)a1;  // compiles ok, ClassCastException
    }
}

我的问题是粗体字。我的理解是,对于要编译的代码,只需要满足这些类处于相同的层次结构中,并因此可以起作用即可(在树上隐式强制转换,在树上隐式强制转换)。每当我遇到ClassCastException时,是因为引用指向树上的一个对象,例如,指向B类型的对象的B类型的引用。

问题所在的行似乎是指向类型A的对象的类型A的引用。强制转换为(B)显然是导致ClassCastException的原因。有人可以解释一下如何做到这一点吗?

注意:如果a1指向B类型的对象,则它可以工作(刚刚对其进行了测试)。因此,对于编译器,向下转换是合法的,并且如果引用指向正确类型的对象,则可以毫无例外地执行该向下转换。

通过将A ref a1强制转换为B并将其分配给a,看来A ref a不再期望引用类型A的对象,而是B?

谢谢,肖恩。

PS我知道这有点不寻常,准备Java认证。通常我们向下转换到左侧的类型,例如b =(B)a;
(而且我可以看到为什么给出了ClassCastException)。


问题答案:

通过继承,所有B均为A。但是,并非所有的A都是B。该特定实例不是,因此运行时异常。



 类似资料:
  • 问题内容: 假设Java具有以下层次结构类: 这是C#中相同代码的(盲)重复: 当我执行Java代码时,我得到了C#返回的信息。 对我来说,C#的结果更有意义,因为引用B调用了它自己的方法。 Java设计者决定打印而不是打印的逻辑是什么?我的意思是,为什么引用B在C中使用覆盖方法?这种方法的优势是什么? 如何更改Java代码以像C#一样打印出来?我的意思是,我怎么教Java调用它使用的完全引用的方

  • 本小节我们将学习 Java 的继承,通过本小节的学习,你将知道什么是继承,继承有什么特点,如何实现继承,方法重写的概念和实现,方法重写和方法重载是比较容易混淆的概念,我们也会介绍两个概念的区别,这些都是本小节的重点,本小节的最后我们还会介绍 super 关键字以及 final 关键字。 1. 概念和特点 1.1 概念 继承是面向对象软件技术当中的一个概念。如果一个类别 B “继承自” 另一个类别

  • 问题内容: 问题的简短摘要:我有一个父类,并由子类扩展。 该子类使用super调用Parent的构造函数: 我想知道是否可以在Grandchild类的构造函数中调用super()方法来扩展Child类: 问题答案: super()在继承上一级调用构造函数,如果存在无参数的构造函数,则将隐式调用该构造函数。 对象是从继承的最高层初始化的,在您的情况下是对象>父>子>孙。 从文档中:

  • 问题内容: 我有一个Java类,它会触发自定义Java事件。该代码的结构如下: 一切正常,但是我想创建一个新的A类(称为B),这可能会引发一个新事件。我正在考虑以下修改: 这是正确的方法吗?我在网上搜索示例,但找不到任何示例。 在此解决方案中,有几件事我我不喜欢: 有两种方法,一种使用另一种方法作为参数。 类都具有和方法。是否应该使用private关键字隐藏addAListener? [更新:无法

  • 问题内容: 为什么Java中的枚举不能从其他枚举继承?为什么以这种方式实施? 问题答案: 例子 因为将元素添加到枚举将有效地创建超类,而不是子类。 考虑: 这与常规类的工作方式相反。我想可以以这种方式实施,但实施起来比看起来要复杂得多,而且肯定会使人们感到困惑。

  • 问题内容: 我无法理解以下输出。 我不知道为什么输出为10,我认为该行创建了B类的新实例,我认为结果应为20 为什么这样工作..请解释。 问题答案: 首先,请参见 隐藏字段 (添加了重点) 在一个类中,与超 类中的字段 同名的字段会 隐藏超类的字段 ,即使它们的类型不同 换句话说,这是不是“遗产”,因为你实际上隐藏的背后的,和你正在使用的参考对象,所以你得到它的领域。如果这样做了,您将看到预期的效