我有一个抽象类Animal,然后我有像Dog和Cat这样的类,它们扩展了Animal类。
我想确保父类Animal的所有子类都有一个静态方法:getProperties。即使其他人无法访问我的代码,也实现了一个新的Animal子类。
我希望它是静态的,因为Dog类的所有Animals都有完全相同的属性(或者你不需要Dog来知道Dog的一般外观),因此它是对classtype调用的方法,而不是类实例,这是有道理的。
这可能吗?
Java中的static
表示该方法(例如)与该类的任何实例都不相关。它对所有实例都是通用的,并且它的实现只是嵌套在类中。
当我读到您的问题时,我相信您需要在Animal
类中使用abstract
方法。
public abstract class Animal {
public abstract <some-return-type> getProperties();
}
在这种情况下,继承Animal
的每个类都必须提供getProperties
方法的实现(在这种情况中,它是而不是static
)。
如果您希望它是静态的,只需使它成为静态的(在Animal
类中),但您将有一个单个和共享实现。
public abstract class AnimalDescriptor<T> { // or <T extends Animal>
public abstract List<String> getProperties();
public abstract T newAnimal();
}
public class DogDescriptor extends AnimalDescriptor<Dog> {
public static final DogDescriptor INSTANCE = new DogDescriptor();
public List<String> getProperties() { ... }
public Dog newAnimal() { return new Dog(); }
}
void doStuff(AnimalDescriptor<?> desc) {
desc.getProperties();
}
doStuff(DogDescriptor.INSTANCE);
这只是一个例子,你必须适应你的需要。例如,您可能希望在动物侧添加getDescriptor()
方法。
否,不可能。静态上下文中没有继承。不,没有办法强制类实现静态方法。
这在Java中是不可能的,你最多可以"隐藏"一个静态方法,但不能"覆盖"它。
如果您想让每个Animal类提供有关它的元数据,请为它提供getProperties
、getNumberOfLegs
、getLocomotionType
等实例方法。您可以使用静态常量来实现这些:
public abstract class Animal {
public abstract int getNumberOfLegs();
}
public class Dog {
private static final NUMBER_OF_LEGS = 4;
public int getNumberOfLegs() {
return NUMBER_OF_LEGS;
}
// ...
}
我想您想要getProperties
方法的某种Map
。这样做的问题是,您必须非常小心,使返回的映射不可变。一个错误,有人可以为每个人更改静态实例。使该方法成为实例方法几乎不需要花费任何费用。
静态方法需要能够在不显式创建Animal
类的新实例的情况下运行。您必须全面实施Animal.getProperties()
。