java静态方法和接口/继承

时间:2015-12-01 12:31:36

标签: java inheritance static

好的,所以我有一个类和子类的层次结构。 他们都必须有某些方法。这些方法位于由超类和以下所有内容实现的接口中。

他们应该有一个方法并且定义但是该方法是“精神上”的静态类型,为给定类的所有实例返回相同的结果。

不幸的是,一个人不能将静态方法作为接口的一部分,静态方法也不支持继承,它们“隐藏”而不是“覆盖”。

那么,静态方法的选项有哪些,层次结构中的所有类必须具有并且可以通用方式调用?目前,我使这种方法非静态......

另外,理想情况下,这不应该涉及必须与该方法保持同步的第二层类...

非常感谢

==

编辑:人们问了一个例子,所以你去了:

好吧,假设我有一个动物类的层次结构(抽象动物类>抽象哺乳动物类>猫类,狗类,海豚类等)。 某些行为将是特定于实例的,它们可能具有“weight”,“name”,“age”等成员,并且具有相关的getter / setter。

但是,可能有一种方法通常会为给定类的所有实例提供相同的结果,例如它可能是其中之一:

-int getNumberOfLegs();
-String getFavouriteFood();

所有猫都有4条腿,因此该方法可以是静态的,它不依赖于实例。它更像是元信息。我希望能够做Cat.getNumberOfLegs()。我想以一种可以被覆盖的方式强制在我的所有层次结构上存在该方法。

2 个答案:

答案 0 :(得分:1)

虽然如果你能用例子支持你的问题会更好。根据我的理解,您希望子类为某些方法编写自己的行为 - 因此您需要重写。因此,这种方法可能不是静态的候选者。你可以做的最好的事情就是拥有一个抽象的课程。如果您真的坚持,请提供默认实施。或者只是确保每个子类都定义它。为此,使方法自我抽象。

编辑后: 引用你:

  

我想以一种可以覆盖的方式强制在我的所有层次结构上存在该方法,等等。

上面显然表明你需要摘要。不是静态的。

-int getNumberOfLegs();
-String getFavouriteFood();

对于海豚和狗来说会有所不同。所以你无法通过静态方法来做到这一点。静态方法可以用于你的mammel类,它可以有类似

的东西
String getMyNature {
    // return Mammel nature
}

静态必须是班级。但是,由于您希望相同的接口访问特定于实例的信息,因此您必须使用抽象(用于强制每个实现具有它)。

答案 1 :(得分:1)

除了Animal中的一个抽象方法,它将在每个类中被覆盖,以提供像

这样的常量值
class Cat extends Animal {
    private static final int NUMBER_OF_LEGS_ON_A_CAT = 4;

    @Override
    public int getNumberOfLegs() {
        return NUMBER_OF_LEGS_ON_A_CAT;
    }
}

您还可以在超类中创建非抽象方法,并通过超级构造函数提供常量,如下所示:

class Animal {
    private final int numberOfLegs;

    protected Animal(int numberOfLegs) {
        this.numberOfLegs = numberOfLegs;
    }        

    public final int getNumberOfLegs() {
        return numberOfLegs;
    }
}

class Cat extends Animal {
    private static final int NUMBER_OF_LEGS_ON_A_CAT = 4;

    public Cat() {
        super(NUMBER_OF_LEGS_ON_A_CAT);
    }
}

这种方法可能不那么冗长,另一方面,如果有太多像这样的常量,它会变得非常难以理解。

然而,底线是静态方法和子类型不能很好地结合在一起,所以你可以做的最好的方法是使方法非静态并确保它返回的数据是静态的 - 这是通过提供一个来实现的。通过构造函数进入final字段,通过在overriden方法中返回一个常量等等。