初始化对象并将对象放入 HashMap 的不同方法

Different ways to initialize and put objects to HashMaps

我一直在研究 HashMaps,并意识到在具有 main() 的 class 中实例化 HashMaps 的行为与在没有 main 的 class 中实例化时的行为不同。

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() 的 class 中初始化 HashMap 的正确方法是什么?

Main 只是一个 void(方法),就像任何其他方法一样,只是它首先执行。如果您想像这样放置代码,请将其放入 void 或任何其他方法中 returning 任何类型(可以是静态的或实例 - 无关紧要)。

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;
    }

您还可以 return 您的 HashMap:

public Map returnNewMap(){
          HashMap<String, Object> shapes = new HashMap<String,Object>();
            shapes.put("Circle", new Circle());
            return shapes; //here's your HashMap returned
    }

您可以像这样使用双括号初始化:

Map<String,Object> map = new HashMap<String,Object>() {
 {
    put("circle", new Circle());
 }
};
shapes.put("circle", new Circle());

此代码不在方法或 static 块中。这段代码不能在class的body中随意执行。这将导致编译错误。

初始化块:

abstract class GeometricObject
{  
    HashMap<String, Object> shapes = new HashMap<String,Object>();
    {
        shapes.put("Circle", new Circle());
    }
}

我认为您的问题是您在抽象 class 中实例化 HashMap,使 class 非抽象或子 class 它并且错误应该消失。我在许多 classed 中使用过 Hashmap,但从未遇到过问题,这里是来自 Oracle 的抽象 class 的定义,

抽象类 与接口相比

抽象classes类似于接口。您不能实例化它们,并且它们可能包含声明有或没有实现的混合方法。但是,使用抽象 classes,您可以声明非静态和最终的字段,并定义 public、protected 和 private 具体方法。对于接口,所有字段自动为 public、static 和 final,并且您声明或定义(作为默认方法)的所有方法都是 public。此外,您只能扩展一个 class,无论它是否是抽象的,而您可以实现任意数量的接口。

这是一种方法,但不是唯一的方法。

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

import java.util.HashMap;

abstract class GeometricObject
{   
     HashMap<String, Object> shapes;
     {shapes = new HashMap<String,Object>(){{
         put("Circle", new Circle());
         put("Square", new Square());
     }};}
}