我已经定义了一个类,我希望有一个类方法(或变量,我并不在乎),每个继承的类都需要覆盖它。我最好的方法都没有成功:
public abstract String getHumanString();
,因为抽象方法不能是静态的
public static String getHumanString();
,因为静态方法只能隐藏,不能覆盖。
我不知道是否还有其他可以使用的技巧。我也很乐意自己在父类上自动定义getHumanString()
类似于人性化(class.getClass().getName()
)(根据我的需要,我只是让getName()
看起来更漂亮) ,静态方法无法访问getName()
。总而言之,我的问题是:
1。我可以使用可在子类上编辑的静态方法/变量吗?
OR,作为另一个有效的解决方案:
2。我可以创建一个使用自己的类名称播放的静态方法吗?
提前致谢。
修改
想象一下这种情况(我会跳过无用的行,因为我在这里直接编写代码):
class ParentClass {
public static (or whatever) String getHumanString() {
return "My Parent Class";
}
public static showMyInfo() {
System.out.println(getHumanString());
}
}
class ChildClass {
@Override
public static (or whatever) String getHumanString() {
return "My Child Class";
}
}
...
public static void main()
{
ChildClass.showMyInfo();
}
它应该输出(我想要的)“我的孩子班级”,但它实际输出(众所周知)“我的父班”。
答案 0 :(得分:4)
静态方法不是多态的,不是。顺便说一下,变量也不是 - 你不能覆盖变量,甚至是实例变量。你可以隐藏它们,但不能覆盖它们。
说实话并不是很清楚 - 但是你可能希望考虑相应的类型层次结构,以便静态方法成为新类型中的实例方法。 / p>
答案 1 :(得分:3)
我希望每个类都有一个可读的名称(不仅仅是getClass()。getName()),它不依赖于对象实例。事实上,当我需要getHumanString()时,我想避免实例化该类。
有一个属性文件,类名为key,人字符串为value。还有一个静态的方法来阅读它。
static String getHumanString(Class<?> clazz){
return humanStrings.getProperty(clazz.getName(), clazz.getSimpleName());
}
如有必要,还可以进行本地化。此外,您可以“增强”现有的类,其定义无法更改。
答案 2 :(得分:0)
如果这是一项要求,我建议将static
成员和字段拆分为自己的类。这样,您现有的类可以引用一个多态的类的static
实例。