为什么上播不显示运行时多态性?

发布于 2021-01-30 16:42:08

我写了一段代码来了解运行时多态性…

class S{
     int i=1;
    void m(){
        System.out.println("sssssssssssssssssssss");
    }
}
public class A extends S{

    int i=2;

    void m(){
        System.out.println("aaaaaaaaaaaaaaaaaaaaaaaa");
    }

    public static void main(String[] args) {
        S a=(S)new A();
        System.out.println(a.i);
        a.m();
    }
}

实例变量受到编译时的约束,但是为什么A这里的对象的向下转换没有意义?表示它是调用A's方法而不是S's方法?

关注者
0
被浏览
95
1 个回答
  • 面试哥
    面试哥 2021-01-30
    为面试而生,有面试问题,就找面试哥。
    S a = (S)new A();
    

    让我们看看这里有什么:

    1. 可变a的的, 引用类型 S ;
    2. 一个实例创建表达式,产生一个对象类型A,其中A extends S;
    3. 一个 向上转型表达式参考 ,向上转型上述表达式成型S;
    4. 将3.的结果分配给变量a

    阅读Java时,您必须牢记以下几点:

    • 对象类型 :对象永远不能更改其类型。在您的示例中,对象的类型为A
    • 引用类型 :在您的示例中,您将类型最初的引用转换为类型A的引用S。您已将该引用分配给a

    当您在对象上调用方法时,实际调用的方法完全不取决于 引用 的类型,而仅取决于 对象 本身的类型。A因此,对象的类型A就是类型中的方法被调用。

    另一方面,当您访问实例变量时,多态性将不适用,并且引用的类型变得必不可少。随着a.i您访问i的超宣布S,与((A)a).i您访问iA。请注意,该类A拥有
    两个 实例变量,都名为i,您可以单独引用每个实例变量。


    术语说明

    术语“参考类型”实际上是更正确的“产生参考的表达类型”的简写。这是一个纯粹的编译时工件:在运行时没有与引用相关联的类型信息,它只是一种位模式。将此与对象的类型(仅是
    运行时 工件)进行对比:编译器通常不知道表达式中所涉及的对象的类型,而只是对其进行 断言
    。当此类断言在运行时失败时,结果是ClassCastException。



推荐阅读
知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看