Java获取此运行时类?

Adj*_*ion 1 java reflection inheritance runtime

假设我有以下对象层次结构:

public abstract class Animal {
    ...
}

public class Canine extends Animal {
    ...
}

public class Feline extends Animal {
    ...
}

public class Dog extends Canine {
    ...
}

public class Wolf extends Canine {
    ...
}

public class Leopard extends Feline {
    ...
}
Run Code Online (Sandbox Code Playgroud)

假设Animal该类有一个最终方法,需要采取不同的操作,具体取决于对象的运行时类型/类是什么:

public abstract class Animal {
    // Lots of stuff blah blah blah

    public final makeNoise() {
        // If we're a Dog, then System.out.println("Woof!");
        // Else if we're a Wolf, then System.out.println("Gggrrrrr!");
        // etc.
    }
}
Run Code Online (Sandbox Code Playgroud)

这里是踢球者:知道最佳实践和OOP会让我写成makeNoise()一个抽象方法,然后在每个子类中实现一个不同的版本.但是,由于这个问题范围之外的原因,我不能这样做.

因此,除了最好的OOP实践外,我怎么能从父makeNoise()方法中说出我们的运行时类是什么?

NPE*_*NPE 5

您可以使用instanceof运算符:'instanceof'运算符用于什么?

请记住,以您要求的方式执行操作需要Animal了解其所有子类(直接或其他方式).这显然不会扩展并引发维护问题.