gpt4 book ai didi

java - 为什么向上转换不显示运行时多态性?

转载 作者:行者123 更新时间:2023-12-01 23:16:00 25 4
gpt4 key购买 nike

我编写了一段代码来理解运行时多态性...

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

实例变量受编译时绑定(bind)的约束,但为什么A对象的向下转换在这里没有意义?意味着它调用的是 A 的 方法而不是 S 的 方法?

最佳答案

S a = (S)new A();

让我们看看这里有什么:

  1. 变量 a引用类型 S
  2. 生成 A 类型对象的实例创建表达式,其中 A 扩展 S
  3. 一个引用向上转型表达式,将上述表达式向上转型为类型S
  4. 将 3. 的结果赋值给变量 a

阅读 Java 时必须牢记以下区别:

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

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

另一方面,当您访问实例变量时,多态性不适用,并且引用的类型变得至关重要。使用a.i可以访问在父类(super class)型S中声明的i,使用((A)a).i可以访问从A访问i。请注意,类A 拥有两个 实例变量,均名为i,您可以单独引用每个变量。

<小时/>

术语说明

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

关于java - 为什么向上转换不显示运行时多态性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21202293/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com