Java抽象类与多态:为何可将抽象类作为方法参数?
关于抽象类作为方法参数的疑问解答
你搞混了抽象类的引用和抽象类的对象这两个核心概念:
- Java确实不能直接创建抽象类的对象,但完全可以声明抽象类类型的引用变量。方法里的
GameCharacter gamechar只是一个引用,不是抽象类的实例本身。 - 实际调用这个方法时,传入的参数必须是
GameCharacter的非抽象子类的实例——子类只要实现了抽象类里所有的抽象方法,就能正常实例化。比如你写一个Hero类继承GameCharacter并实现所有抽象方法,调用setPlayer(new Hero())时,gamechar这个引用就指向了Hero的对象,而不是抽象类的对象。 - 这是Java多态的典型用法:用抽象类作为方法参数,能接收所有它的子类实例,让代码更灵活。比如后续新增
Monster子类,同样可以传给这个方法,不用修改方法的定义。
举个简单的代码示例辅助理解:
// 抽象类 abstract class GameCharacter { abstract void attack(); } // 子类实现抽象类 class Hero extends GameCharacter { @Override void attack() { System.out.println("Hero attacks!"); } } // 调用setPlayer方法 public class Game { public void setPlayer(GameCharacter gamechar) { gamechar.attack(); // 实际调用的是子类Hero的attack方法 } public static void main(String[] args) { Game game = new Game(); game.setPlayer(new Hero()); // 传入子类实例 } }
内容的提问来源于stack exchange,提问作者Ömer Gün
相关产品推荐
相关产品推荐

