Java,对HashMap中给定的元素调用静态方法,如何?
无效!在Java,对HashMap中给定的元素调用静态方法,如何?,java,hashmap,Java,Hashmap,无效!在Depot中没有callMe()。如何避开它?您的代码有两个主要问题: Depot.get(“1”)具有类型Depot,并且Depot不声明callMe方法 即使Depot声明了callMe方法,静态方法也不是虚拟的(因此不可重写),因为它们不是在实例上调用的,而是在类上调用的。(这就是“static”在Java中的意思。)因此类似于depots.get(“1”).callMe()的东西将调用Depot.callMe,而不是Depot1.callMe。(在Java中,当callMe是静
Depot
中没有callMe()
。如何避开它?您的代码有两个主要问题:
具有类型Depot.get(“1”)
,并且Depot
不声明Depot
方法callMe
- 即使
声明了Depot
方法,静态方法也不是虚拟的(因此不可重写),因为它们不是在实例上调用的,而是在类上调用的。(这就是“static”在Java中的意思。)因此类似于callMe
depots.get(“1”).callMe()的东西将调用
,而不是Depot.callMe
。(在Java中,当Depot1.callMe
是静态方法时,它甚至允许您编写callMe
而不是depots.get(“1”).callMe()
,这无疑是一个错误。)Depot1.callMe()
- 更改
以声明抽象的、非静态的Depot
方法callMe
- 删除其子类中的
关键字,以便它们重写该方法static
- 我相信您误解了静态方法的概念。这些方法与类关联,而不是与对象关联。因此,试图覆盖它们是没有意义的
您可能需要解释为什么要将
callMe
设置为静态,因为可能有更好的方法来实现您想要的。我认为您想要做的是需要多态性的事情
您需要一个包含callMe方法的接口
depots.get("1").callMe()
及其实施:
public interface Depot {
void callMe();
}
现在,在主类中,您可以从HashMap调用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!");
}
}
import java.util.HashMap;
导入java.util.Map;
公共班机{
公共静态void main(字符串[]args){
Map Map=newhashmap();
map.put(1,newdepot1());
map.put(2,新Depot2());
map.get(1.callMe();//Depot1!
map.get(2.callMe();//Depot2!
}
}
您的方法名称不一致。getStarterDirection
和callme
之间的关系是什么?您试图在哪里定义getStarterDirection
?我在你的定义中看不到它。您的基本Depot
类不包含任何方法,因此您希望如何对其进行调用?抱歉,我已经解决了这个问题。@JohnSmith多态性不适用于静态方法。因此,您调用的每种类型callMe
实际上都会从Depot调用静态方法。我很震惊,这不是我第一次遇到这种静态的东西。那些“callMe”返回静态数据。我的意思是,这就像得到一个最终的整数,或者一个常数,或者类似的东西。其结果取决于类本身,而不是它的实例。就像Math.max不是静态的一样。创建新的Math().max有什么意义?
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!");
}
}
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!
}
}