Java 强制转换:为什么子类属性在指定给超类变量时变得不可访问?

Java 强制转换:为什么子类属性在指定给超类变量时变得不可访问?,java,casting,Java,Casting,在下面的示例中,我有两个类Super和Sub。Sub扩展了Sup: 当我尝试执行此代码时: Super obj=new Sub(); obj.subMethod(); Sub subObj=(Sub)obj subObj.subMethod(); 我遇到了一个编译时错误。子类字段和属性存储在哪里?为什么我无法访问它们 但是,当我按以下代码键入cast对象时: Super obj=new Sub(); obj.subMethod(); Sub subObj=(

在下面的示例中,我有两个类Super和Sub。Sub扩展了Sup:

当我尝试执行此代码时:

    Super obj=new Sub();
    obj.subMethod();
Sub subObj=(Sub)obj
subObj.subMethod();
我遇到了一个编译时错误。子类字段和属性存储在哪里?为什么我无法访问它们

但是,当我按以下代码键入cast对象时:

    Super obj=new Sub();
    obj.subMethod();
Sub subObj=(Sub)obj
subObj.subMethod();

字段和属性再次变得可访问。java是如何处理这些字段和属性的。如何访问无法从超级类对象访问的字段和属性?我很难理解这些幕后的概念。请帮帮我

子类继承父属性和方法,反之亦然

Super obj=new Sub();
obj.subMethod();
obj是超级类引用,超级没有名为subMethod的方法,因此编译错误

当您编写超级obj时; 它告诉编译器类型是Super,因此它将只查找在Super中定义的方法


您调用的方法应该属于该类型。

当您说Super obj=new Sub时,您基本上是在告诉编译器,唯一可以保证的是obj指向Super类的对象。事实上,它实际上指向一艘潜艇,但如果我告诉你带一只动物去挤奶,你会不会有点怀疑?我告诉你,它是一种动物并不意味着它是一头奶牛,或者其他可以挤奶的东西。就你所说的,它可能是一只蜜蜂!编译器只知道你告诉它什么


然而,当你可以保证动物确实是可以挤奶的东西,或者超级是一个带面具的潜水艇时,当然有一种方法可以避免这种情况。正如你所看到的,这就是所谓的铸造。基本上是你告诉编译器相信你,你知道你在做什么。当然,如果你错了,你会得到一个异常,所以你在强制转换时需要小心。

当子类变量存储在super classes对象中时,java是如何隐藏变量的???当我们强制转换存储在super classes对象中的子类对象时,java是如何使这些变量和方法再次可访问的?回溯时,该过程是如何处理的,特别是当对象被转换时,它的所有属性和字段都返回到它分配给超级类对象之前的方式吗?对象的属性和字段从未更改;它们只是隐藏的。因此,是的,所有的属性都将保持不变。此外,如果有一个类重写了它的超类的方法,将其强制转换并调用该方法,则仍然会调用被重写的版本。您需要了解编译时类型和运行时类型之间的区别。以及动态类型语言和静态类型语言之间的区别。当你说Super obj=sub;,编译器忘记了obj实际上是一个子编译时类型,即使在运行时它很可能是一个子编译时类型。