为什么上播不显示运行时多态性?
我写了一段代码来了解运行时多态性…
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
方法?
-
S a = (S)new A();
让我们看看这里有什么:
- 可变
a
的的, 引用类型S
; - 一个实例创建表达式,产生一个对象类型
A
,其中A extends S
; - 一个 向上转型表达式参考 ,向上转型上述表达式成型
S
; - 将3.的结果分配给变量
a
。
阅读Java时,您必须牢记以下几点:
- 对象 的 类型 :对象永远不能更改其类型。在您的示例中,对象的类型为
A
; - 引用 的 类型 :在您的示例中,您将类型最初的引用转换为类型
A
的引用S
。您已将该引用分配给a
。
当您在对象上调用方法时,实际调用的方法完全不取决于 引用 的类型,而仅取决于 对象 本身的类型。
A
因此,对象的类型A
就是类型中的方法被调用。另一方面,当您访问实例变量时,多态性将不适用,并且引用的类型变得必不可少。随着
a.i
您访问i
的超宣布S
,与((A)a).i
您访问i
的A
。请注意,该类A
拥有
两个 实例变量,都名为i
,您可以单独引用每个实例变量。
术语说明
术语“参考类型”实际上是更正确的“产生参考的表达类型”的简写。这是一个纯粹的编译时工件:在运行时没有与引用相关联的类型信息,它只是一种位模式。将此与对象的类型(仅是
运行时 工件)进行对比:编译器通常不知道表达式中所涉及的对象的类型,而只是对其进行 断言
。当此类断言在运行时失败时,结果是ClassCastException。 - 可变
-
实现运行时的多态性要使用( )。
2022-05-13 关注 0 浏览24 1答案
-
C++语言中的多态性是在编译时通过 ______ 和模板体现的,在运行时是通过 ______体现的。
2022-05-13 关注 0 浏览20 1答案
-
在docker中分离运行时,Python应用程序不显示任何内容
2021-02-01 关注 0 浏览123 1答案
-
什么是动态多态性?
2020-12-26 关注 0 浏览92 1答案
-
参数多态性与Ad-hoc多态性
2021-01-30 关注 0 浏览99 1答案
-
Java中的运行时多态示例?
2021-01-30 关注 0 浏览100 1答案
-
Java中的多态性:为什么我们将父引用设置为子对象?
2021-01-30 关注 0 浏览64 1答案
-
实现运行时多态的机制是()
2022-03-03 关注 0 浏览37 1答案
-
运行时为什么找不到类?
2021-02-01 关注 0 浏览145 1答案
-
为什么Go程序需要运行时支持
2021-02-01 关注 0 浏览107 1答案