Referencing Subclass Objects with Subclass Vs. Superclass Reference

2025年5月10日 | 阅读 4 分钟

在 Java 中,子类对象的引用既可以通过子类引用,也可以通过超类引用。区别在于可以访问哪些方法或字段,以及程序的行为如何根据引用类型而变化。

在 Java 中引用子类对象

Java 中,有两种常见的引用子类 对象 的方式。每种方法都有其优点和局限性,并且在编译时使用的引用类型决定了运行时方法如何解析。

1. 通过超类引用进行引用

可以使用超类引用来引用作为该超类派生出的子类实例的任何对象。这种方法允许将子类对象赋值给超类引用变量。当子类重写了方法时,由于动态方法分派(dynamic method dispatch),会调用子类中重写后的方法,而不是超类中的方法。

2. 通过子类引用进行引用

当您想直接处理子类对象时,可以使用子类引用。这种方法使您可以访问子类或从超类继承的方法和字段,只要它们是子类的一部分。

下面是一个演示这两种方法的程序

输出

 
Using parent class reference:
Gears: 5
Speed: 150
Seat Height: 30

Using child class reference:
Gears: 4
Speed: 120
Seat Height: 25
Updated Seat Height: 35
After typecasting:
Gears: 5
Speed: 150
Seat Height: 45   

解释

  1. 超类引用: 超类引用可以指向子类对象。
  2. 方法访问: 使用超类引用,您只能访问超类中定义的方法,而不能访问子类特定的方法。
  3. 动态方法分派: 即使使用超类引用,运行时也会调用子类中重写的方法。
  4. 子类引用: 子类引用允许访问超类和子类的所有功能。
  5. 类型转换: 使用超类引用时,需要类型转换才能访问子类特定的功能。

使用超类引用和子类引用进行引用的区别

方面超类引用子类引用
对象持有它可以持有其自身 和任何子类的对象。它只能持有其子类的对象。
方法访问它只能访问子类中定义或重写的方法。它可以访问超类和子类的方法。
子类特定功能不进行类型转换,它不能直接访问子类特定的功能。它可以直接访问子类特定的功能。
类型转换要求需要类型转换才能访问子类特定的功能。访问超类和子类功能均不需要类型转换。