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
。如何躲闪它?
答案 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!
}
}