我有抽象类Animal,然后我有像Dog和Cat这样的类,它扩展了Animal类。
我想确保父类Animal的所有子类都有一个静态方法:getProperties。即使其他人无法访问我的代码,也会实现一个新的Animal子类。
我希望它是静态的,因为所有类型Dog的动物都具有完全相同的属性(或者你不需要Dog来了解Dog的外观如何通用),因此它是有意义的,它是一个被调用的方法classtype,而不是类实例。
这可能吗?
答案 0 :(得分:2)
Java中的static
意味着该方法(例如)与该类的任何实例无关。这对所有实例都很常见,它的实现只是嵌套在类中。
当我读到您的问题时,我认为您需要在abstract
课程中使用Animal
方法。
public abstract class Animal {
public abstract <some-return-type> getProperties();
}
在这种情况下,每个继承Animal
的类都必须提供getProperties
方法的实现(在这种情况下不 static
)
如果您希望它是静态的,只需这样做(在Animal
类中),但是您将拥有单个和共享实现
答案 1 :(得分:1)
不,不可能。静态上下文中没有继承。不,没有办法强制实现一个类来实现静态方法。
答案 2 :(得分:1)
Java Object model不支持类端继承(与Smalltalk或Ruby不同)。 您必须明确实现域的元模型,例如:
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()
方法。
答案 3 :(得分:0)
在Java中这是不可能的,你可以“隐藏”一个静态方法,但不能“覆盖”它。
答案 4 :(得分:0)
如果您希望让每个Animal类提供有关它的元数据,请为其提供实例方法,如getProperties
,getNumberOfLegs
,getLocomotionType
等。您可以使用静态常量实现这些:< / p>
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;
}
// ...
}
我想你想要Map
方法的某种getProperties
。问题在于你必须非常小心地使你返回的地图不可变。一个错误,有人可以为每个人更改静态实例。使该方法成为实例方法几乎不需要任何费用。
答案 5 :(得分:0)
静态方法需要能够在没有显式创建Animal
类的新实例的情况下运行。您必须全面实施Animal.getProperties()
。