java - 将一种类型的对象声明为另一种类型的实例有什么好处?

标签 java oop polymorphism

<分区>

Possible Duplicate:
What does Base b2 = new Child(); signify?

我是 Java 初学者。我了解类继承的概念,但有一件事我不太了解。我正在阅读 Java for Dummies,它正在解释多态性。它以这段代码为例:

class Player {
    public void move() {...

class BetterPlayer extends Player {
    public void move() {...

public class TicTacToeApp {
    public static void main(String[] args) {
        Player p1 = new Player();
        Player p2 = new BetterPlayer();
        playTheGame(p1, p2);
    }

    public static void playTheGame(Player p1, Player p2) {
        p1.move();
        p2.move();
    }
}

为什么将 p2 创建为 Player 对象?这是我的理解:

如果 p2 是一个 BetterPlayer 对象(声明如下:BetterPlayer p2 = new BetterPlayer...):
-向上转换是自动的,所以它仍然可以与 playTheGame 方法一起使用
-p2 可以被任何需要 BetterPlayer 对象的方法使用

但由于它是作为一个 Player 对象创建的,现在任何时候 p2 被需要 BetterPlayer 对象的方法使用时,它都必须显式转换为 BetterPlayer 对象,对吗?这似乎是没有任何好处的更多工作,所以我猜这样做一定有一些好处;这是什么?

最佳答案

变量 p2 不是作为 Player 对象创建的。它是指向 BetterPlayer 对象的引用。

无论 p2 声明为 Player 还是 BetterPlayer 引用,它都可以用作 Player 引用。

将其声明为 Player 的一个优点是可以防止您耦合任何仅适用于 BetterPlayer 的代码,从而保持开放的选项,以便在未来将代码用于另一个子类选项——例如 BestPlayer。

关于java - 将一种类型的对象声明为另一种类型的实例有什么好处?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4454439/

相关文章:

c# - 从它自己的类中声明一个静态对象

c++ - 'private'访问修饰符是否给了编译器更大的优化空间?

javascript - 多维数组与对象数组

java - Jackson XML - 反序列化空类和多态性

c++ - 简单程序中的虚拟析构函数导致编译器错误 : "unresolved external symbol"

java - 如何重新排列字符串中的字符?

java - 如何通过两级路由器upnp转发端口

java - 未构建用于过滤 Spring Boot URL 的类

java - 动态构建器模式

java - 为什么第二次运行后才出现 "Try a higher/lower number."?