Java,从HashMap给出的元素上调用静态方法,如何?

时间:2016-10-13 22:00:26

标签: java hashmap

class Depot
{
}

class Depot1 extends Depot
{
    public static void callMe() { }
}

class Depot2 extends Depot
{
    public static void callMe() { }
}

class Depot3 extends Depot
{
    public static void callMe() { }
}

class Depot4 extends Depot
{
    public static void callMe() { }
}

HashMap<Integer, Depot> depots;

depots.put("1", new Depot1());
depots.put("3", new Depot3());

现在:

depots.get("1").callMe()

无效! callMe()中没有Depot。如何躲闪它?

3 个答案:

答案 0 :(得分:2)

您的代码有两个主要问题:

  • depots.get("1")的类型为Depot,而Depot未声明callMe方法。
  • 即使Depot确实声明了callMe方法,静态方法也不是虚拟的(因此不可重写),因为它们不会在实例上调用,但是而是在上。 (这就是Java中“静态”的意思。)所以depots.get("1").callMe()之类的东西会调用Depot.callMe,而不是Depot1.callMe。 (当Java depots.get("1").callMe()是静态方法时,它甚至可以让你写Depot1.callMe()而不是callMe,这可能是Java中的一个错误。)

解决此问题:

  • 更改Depot以声明抽象的非静态callMe方法。
  • 删除其子类中的static关键字,因此它们会覆盖该方法。

答案 1 :(得分:1)

我相信你误解了静态方法的概念。这些方法与类相关联,而不与对象相关联。因此,尝试覆盖它们是没有意义的。

您可能需要解释为什么callMe是静态的,因为这可能是实现您想要的更好方式。

答案 2 :(得分:1)

我认为你想要做的是需要多态的东西..

您需要并且界面包含 callMe 方法

public interface Depot {
    void callMe();
}

及其实施:

public class Depot1 implements Depot{

    @Override
    public void callMe() {
        System.out.println("Depot1!");
    }

}

public class Depot2 implements Depot{

    @Override
    public void callMe() {
        System.out.println("Depot2!");
    }

}

现在,在您的主类中,您可以从HashMap调用callMe,而无需使用静态方法..

import java.util.HashMap;
import java.util.Map;

    public class Main {

        public static void main(String[] args) {
            Map<Integer, Depot> map = new HashMap<>();
            map.put(1, new Depot1());
            map.put(2, new Depot2());

            map.get(1).callMe();    // Depot1!
            map.get(2).callMe();    // Depot2!
        }

    }