如何静态访问子类的覆盖方法?

时间:2017-03-21 11:16:23

标签: java static abstract-class

所以我已经知道在抽象类中使用静态方法是不可能的。但是,是否有一种方法可以在不实例化的情况下访问其子类中的重写方法?

例如,假设我有两个类,一个抽象类元素及其子类Hydrogen,如下所示。这假设我将有多个类似的类,例如Helium,Boron等,它们都是Element的子类。

public abstract class Element {
    public abstract double getMolarMass();
}

public final Hydrogen extends Element {
    @Override
    public double getMolarMass() {
        return 1.008;
    }
}

如何在不必实例化Hydrogen对象的情况下调用getMolarMass方法?

3 个答案:

答案 0 :(得分:1)

在我看来,您希望能够访问子类中的常量,同时允许涉及这些值的多态行为。你可以有一个常量,也可以从你的方法中返回它:

public final class Hydrogen extends Element {
  public static final double MOLAR_MASS = 1.008;

  @Override
  public double getMolarMass() {
    return MOLAR_MASS;
  }
}

然后,您可以静态访问常量:Hydrogen.MOLAR_MASS

答案 1 :(得分:0)

如果方法不是静态的,那么你就不能静态调用它, 另一方面,重写静态方法毫无意义,在java中不允许...

答案 2 :(得分:0)

你想要实现的是创建一个枚举。有一个enum关键字,可以让你直接做你想要实现的目标。

枚举实际上是一个带有几个公共静态最终成员变量的最终类,它们保存对类实例的引用。

enum Element
{
    Hydrogen(1.0),
    Helium(2.0),
    ...;

    private double mass;

    private Element(double masss)
    {
        this.mass = mass;
    }

    public double getMasss()
    {
        return mass;
    }
}

您可以直接访问这些字段,例如:

Element e = Element.Helium;
System.out.println("The mass of " + e + " is " + e.getMass());