声明一种类型的对象与另一种类型的对象有什么好处?

bma*_*pin 3 java oop polymorphism

可能重复:
Base b2 = new Child(); 表示?

我是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();
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

And*_*mas 5

变量p2未创建为Player对象.它是指向BetterPlayer对象的引用.

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

将其声明为播放器的一个优点是,您无法耦合任何仅适用于BetterPlayer的代码,并保持打开将来使用代码作为另一个子类选项的选项 - 例如,BestPlayer.

  • Java有两种变量类型 - 基元和引用.基元是类似布尔,整数和浮点类型的类型.引用基本上是指向类类型对象的指针.变量p2是参考.现在,如果你想调用BetterPlayer.moveFast(),你需要一个BetterPlayer参考 - 但是有一个权衡 - 你失去了使用其他播放器类型的代码的能力.从玩家参考开始,您可以考虑选择. (3认同)