覆盖继承类的类变量/方法

时间:2011-12-15 08:04:45

标签: java

我已经定义了一个类,我希望有一个类方法(或变量,我并不在乎),每个继承的类都需要覆盖它。我最好的方法都没有成功:

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();
}

它应该输出(我想要的)“我的孩子班级”,但它实际输出(众所周知)“我的父班”。

3 个答案:

答案 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实例。