我一直在玩HashMaps并且意识到在没有main的类中实例化时,在具有main()的类中实例化HashMaps的行为会有所不同。
Demo.java
import java.util.HashMap;
public class Demo {
public static void main(String args[]) {
System.out.println(new Circle());
HashMap<String, Object> shapes = new HashMap<String,Object>();
shapes.put("Circle", new Circle());
}
}
GeometricObject.java
import java.util.HashMap;
abstract class GeometricObject
{
HashMap<String, Object> shapes = new HashMap<String,Object>(); //error
shapes.put("Circle", new Circle()); //error
}
在没有main()的类中初始化HashMap的正确方法是什么?
答案 0 :(得分:2)
shapes.put("circle", new Circle());
此代码不在方法或static
块中。此代码不能在类的主体中自由执行。这将导致编译错误。
答案 1 :(得分:1)
初始化块:
abstract class GeometricObject
{
HashMap<String, Object> shapes = new HashMap<String,Object>();
{
shapes.put("Circle", new Circle());
}
}
答案 2 :(得分:0)
Main只是一个void(方法),就像其他任何一个一样,除了它首先被执行。如果你想把这样的代码放在void中或任何其他返回任何类型的方法(可能是静态的或实例 - 无所谓)。
public void noReturn(){
HashMap<String, Object> shapes = new HashMap<String,Object>();
shapes.put("Circle", new Circle());
}
public int returnsInt(){
HashMap<String, Object> shapes = new HashMap<String,Object>();
shapes.put("Circle", new Circle());
return 1;
}
您也可以返回您的HashMap:
public Map returnNewMap(){
HashMap<String, Object> shapes = new HashMap<String,Object>();
shapes.put("Circle", new Circle());
return shapes; //here's your HashMap returned
}
答案 3 :(得分:0)
这是一种做你想要的但不是唯一的方法。
<强> GeometricObject.java 强>
import java.util.HashMap;
class GeometricObject
{
public static HashMap<String, Object> giveMeNewShapesDude() {
HashMap<String, Object> shapes = new HashMap<String,Object>();
shapes.put("Circle-1", new Circle());
shapes.put("Circle-2", new Circle());
shapes.put("Circle-3", new Circle());
return shapes;
}
}
<强> Demo.java 强>
import java.util.HashMap;
public class Demo {
public static void main(String args[]) {
HashMap<String, Object> shapes = GeometricObject.giveMeNewShapesDude();
system.out.println("Shapes : " + shapes);
}
}
此后只需执行一个步骤,即可了解Java language。
答案 4 :(得分:-1)
您可以像这样使用双括号初始化:
Map<String,Object> map = new HashMap<String,Object>() {
{
put("circle", new Circle());
}
};
答案 5 :(得分:-1)
我认为你的问题是你在抽象类中实例化HashMap,使类非抽象或子类化,错误应该消失。我在很多类中使用过Hashmaps,从来没有遇到过问题,这里是Oracle抽象类的定义,
抽象类与接口相比
抽象类与接口类似。您无法实例化它们,并且它们可能包含使用或不使用实现声明的混合方法。但是,对于抽象类,您可以声明非静态和最终的字段,并定义public,protected和private具体方法。使用接口,所有字段都自动为public,static和final,并且您声明或定义的所有方法(作为默认方法)都是公共的。此外,您只能扩展一个类,无论它是否是抽象的,而您可以实现任意数量的接口。
答案 6 :(得分:-2)
import java.util.HashMap;
abstract class GeometricObject
{
HashMap<String, Object> shapes;
{shapes = new HashMap<String,Object>(){{
put("Circle", new Circle());
put("Square", new Square());
}};}
}