0

我一直在玩 HashMaps,并意识到在具有 main() 的类中实例化 HashMaps 在不具有 main 的类中实例化时的行为不同。

演示.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());
    }
}

几何对象.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 的正确方法是什么?

4

7 回答 7

2
shapes.put("circle", new Circle());

此代码不在方法或static块中。这段代码不能在类的主体中自由执行。这将导致编译错误。

于 2015-01-30T23:37:22.223 回答
1

初始化块:

abstract class GeometricObject
{  
    HashMap<String, Object> shapes = new HashMap<String,Object>();
    {
        shapes.put("Circle", new Circle());
    }
}
于 2015-01-30T23:41:29.837 回答
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
    }
于 2015-01-30T23:35:41.367 回答
0

这是做你想做的事的一种方法,但不是唯一的方法。

几何对象.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;
    }
}

演示.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语言

于 2015-01-30T23:48:49.923 回答
-1

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

Map<String,Object> map = new HashMap<String,Object>() {
 {
    put("circle", new Circle());
 }
};
于 2015-01-30T23:36:41.470 回答
-1

我认为您的问题是您在抽象类中实例化 HashMap,使该类成为非抽象类或将其子类化,并且错误应该消失。我在许多分类中使用过 Hashmaps 并且从未遇到过问题,这是 Oracle 抽象类的定义,

抽象类与接口的比较

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

于 2015-01-30T23:44:02.933 回答
-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());
     }};}
}
于 2015-01-30T23:52:43.787 回答