【问题标题】:Java: getting subclass reference using getClassJava:使用 getClass 获取子类引用
【发布时间】:2026-01-27 15:00:01
【问题描述】:

如果我有一个名为 Animal 的超类,以及一个名为 Cat、Dog、Bird 的子类。

如果我读取了一个 Animals 数组,并且想要访问一个名为 meow() 的特定于 Cat 的方法,我该怎么做?

我知道我可以使用 getClass() 来找出 Animal 的子类,但是我如何使用来创建访问 meow() 的引用

【问题讨论】:

  • 您可能必须更改为使用instanceof,因为您可能还继承了Cat 类,您可能还想调用meow 方法。
  • 感谢所有 cmets。

标签: java


【解决方案1】:

如果您使用animals 的数组,您需要检查您正在使用的对象是否是Cat 类的实例,这可以通过使用instanceof 运算符来实现。然后我们可以使用downcasting运算符将Animal转换为Cat,然后调用meow()方法。

if(animal instanceof Cat){
    (Cat)animal.meow()
}

使用数组

Animal [] animals = [];
foreach(Animal animal: animals){
    //do something

    if(animal instanceof Cat){
        (Cat)animal.meow()
    }
}

【讨论】:

  • @stumped :这是做你想做的更合适的方式。
【解决方案2】:

你可以投到Cat

if (animal.getClass().getName().equals('Cat')) {
    ((Cat)animal).meow();
}

或者你可以使用instanceof


这两种解决方案都很丑陋,而且 Java 的设计初衷不是为了以这种方式使用。相反,您应该为可以在内部调用 Cat.meow 的动物创建一个 .speak 方法。

【讨论】:

  • 如果我有一个 speak() 方法,并且我有 20 个动物子类,并且我必须动态引用 Cat 的 speak 方法,我该怎么做?我不能为所有 20 种动物创建一个 getClass.equals()。
  • @stumped 你是说你想让猫说话吗?
  • 不,我的意思是,我正在读取一个 Animals 数组,假设有 100 个动物子类,我需要找出它是哪个子类,然后调用它的 speak 方法。我不知道如何动态创建子类引用。
  • @stumped 你必须像我在我的例子中展示的那样进行投射(以及许多其他人所做的)。这不是你应该如何使用Java。所有 100 只动物都应该实现 speak 方法,你应该只调用 animal.speak 而不必关心动物实际上是什么
【解决方案3】:

一旦找到要使用的子类,就可以强制转换它。在你的情况下,它会是

((Cat)animals[index]).meow();

【讨论】:

    【解决方案4】:

    像这样...

    if (animal.getClass().getName().equals('Cat')) {
        ((Cat)animal).meow();
    }
    

    if (animal instanceof Cat) {
        ((Cat)animal).meow();
    }
    

    【讨论】:

    • 但是如果你只从 getClass() 动态地知道它是 Cat 怎么办