繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM