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

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

东方俊杰
2023-03-14
问题内容

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

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();
    }
}

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


问题答案:
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。



 类似资料:
  • 我使用fiddler监控一个简单的html内容从一个PHP文件运行在localhost。但是每当我按f5刷新页面(浏览器)时,在fiddler中有时整个web会话的字体变成蓝色,即当它实际显示内容(html)时,相反的情况发生在web会话是灰色的时候,它不显示html内容。 注意:始终显示请求/响应标题,这仅用于内容。我还尝试了点技巧(“:80”)并从localhost切换到127.0。0.1.

  • 本文向大家介绍什么是C#中的运行时多态?,包括了什么是C#中的运行时多态?的使用技巧和注意事项,需要的朋友参考一下 运行时多态性具有方法覆盖,也称为动态绑定或后期绑定。它由抽象类和虚函数实现。 抽象类 抽象类包含抽象方法,这些方法由派生类实现。 让我们看一个实现运行时多态性的抽象类的示例- 示例 示例 虚函数 当您在类中定义了要在继承的类中实现的函数时,可以使用虚函数。虚拟函数可以在不同的继承类中

  • 本文向大家介绍什么是运行时多态或动态方法重载?,包括了什么是运行时多态或动态方法重载?的使用技巧和注意事项,需要的朋友参考一下 多态是对象采取多种形式的能力。当使用父类引用来引用子类对象时,会在OOP中最常见地使用多态。被子类覆盖的方法称为运行时多态。JVM确定要在运行时而不是编译时执行的方法。  示例 输出结果

  • 因此,在NetBeans IDE中,一切正常。全力工作。但是在Built&Clean之后,我看不到图像,但所有的操作都完成了。 你能建议出了什么问题吗?因为这个而生气

  • 您将自动执行著名的歌曲“墙上的99瓶XXX”。你将打印这首歌所有99个诗句的歌词。用循环!如果你不知道歌词,用谷歌查一下。 该方案应: a.如果他们不到21岁,或者他们喜欢苏打水,那么歌词是“墙上有99瓶苏打水” B.如果他们超过21岁,那么是“99瓶啤酒” 您必须使用WHILE循环,并且counter变量必须是print语句的一部分! 所以第一节是: 99瓶苏打水挂在墙上 墙上有98瓶苏打水 最

  • 这可以是运行时多态性的一个例子吗? 代码已从这里摘取