[英]Different ways to initialize and put objects to HashMaps
我一直在玩HashMaps,并意识到在没有main()的类中实例化具有main()的类中的实例化HashMaps的行为会有所不同。
演示程序
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的正确方法是什么?
shapes.put("circle", new Circle());
该代码不在方法或static
块中。 该代码不能在类主体中自由执行。 这将导致编译错误。
初始化块:
abstract class GeometricObject
{
HashMap<String, Object> shapes = new HashMap<String,Object>();
{
shapes.put("Circle", new Circle());
}
}
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
}
这是做您想要的事情的一种方法,但不是唯一的方法。
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;
}
}
演示程序
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语言 。
您可以像这样使用双括号初始化:
Map<String,Object> map = new HashMap<String,Object>() {
{
put("circle", new Circle());
}
};
我认为您的问题是,您正在抽象类中实例化HashMap,使该类成为非抽象类或对其进行子类化,并且错误应消失。 我在许多分类中都使用过Hashmap,但从未遇到过问题,这是Oracle的抽象类的定义,
抽象类与接口的比较
抽象类类似于接口。 您无法实例化它们,它们可能包含使用或不使用实现声明的方法的混合。 但是,使用抽象类,您可以声明非静态和最终字段,并定义公共,受保护的和私有的具体方法。 使用接口时,所有字段都自动是公共的,静态的和最终的,并且您声明或定义的所有方法(作为默认方法)都是公共的。 此外,无论是否抽象,您都只能扩展一个类,而您可以实现任何数量的接口。
import java.util.HashMap;
abstract class GeometricObject
{
HashMap<String, Object> shapes;
{shapes = new HashMap<String,Object>(){{
put("Circle", new Circle());
put("Square", new Square());
}};}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.