初始化和将对象放入HashMaps的不同方法

时间:2015-01-30 23:32:29

标签: java collections hashmap java-collections-api

我一直在玩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的正确方法是什么?

7 个答案:

答案 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());
     }};}
}