【问题标题】:Casting to an abstract class转换为抽象类
【发布时间】:2025-12-24 18:55:12
【问题描述】:

好的,所以我有一个抽象类:

public abstract class Animal {
   public abstract String sound();
}

那么,我有一个扩展它的类:

public class Chicken extends Animal {
   public String sound() {
      return "Cockadoodledoo!";
   }
}

然后说我有一个带有 main 方法的测试类:

public class Test {
   Chicken a = new Chicken();
   System.out.println((Animal)a).sound());
}

输出是“Cockadoodledoo!”所以我的问题是,如果我将 a 种姓到 Animal,它仍然会调用 Chicken 中的方法吗?它不会将 a 视为 Animal 的对象吗?是不是因为 sound() 是抽象的所以不能被调用.. 但是它不会给我一个例外吗?

提前谢谢你。

【问题讨论】:

  • 它超载了。你应该期待这个。在这种情况下,基本上你将无法在Animal 中调用sound

标签: class methods call abstract


【解决方案1】:

在内存中创建的对象仍然是Chicken 类的一个实例。您通过强制转换所做的是将其视为 Animal 类的实例,这意味着您只能使用该类可用的方法和属性。

因此,如果您的 Chicken 类具有 LayEgg() 方法,例如,将其转换为 Animal 将意味着您无法调用该方法(除非您转换回,因为它仍然是 @987654326 @ 在机器的内存中)。您仍然可以调用 Animal 可用的方法,其行为将与实际实例化的对象相同。

跟去一模一样:

Animal myAnimal = new Chicken();

【讨论】:

  • 您在此处查找的技术术语是“后期绑定”。