Java 初始化对象并将其放入HashMaps的不同方法

Java 初始化对象并将其放入HashMaps的不同方法,java,collections,hashmap,java-collections-api,Java,Collections,Hashmap,Java Collections Api,我一直在玩HashMaps,并意识到在没有main()的类中实例化HashMaps时,在具有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

我一直在玩HashMaps,并意识到在没有main()的类中实例化HashMaps时,在具有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());
    }
}
import java.util.HashMap;

abstract class GeometricObject
{   
    HashMap<String, Object> shapes = new HashMap<String,Object>(); //error
    shapes.put("Circle", new Circle()); //error
}
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);
    }
}
import java.util.HashMap;
公开课演示{
公共静态void main(字符串参数[]){
System.out.println(新圆圈());
HashMap shapes=新建HashMap();
放置(“圆圈”,新圆圈());
}
}
GeometricObject.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());
    }
}
import java.util.HashMap;

abstract class GeometricObject
{   
    HashMap<String, Object> shapes = new HashMap<String,Object>(); //error
    shapes.put("Circle", new Circle()); //error
}
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);
    }
}
import java.util.HashMap;
抽象类几何对象
{   
HashMap shapes=新建HashMap();//错误
shapes.put(“圆”,new Circle());//错误
}
在没有main()的类中初始化HashMap的正确方法是什么?

main只是一个void(方法),与其他方法一样,只是作为第一个执行。如果您想像这样放置代码,请将其放入void或任何其他返回任何类型的方法(可能是静态的或实例的-无所谓)中

public void noReturn(){
HashMap shapes=新建HashMap();
放置(“圆圈”,新圆圈());
}
公共int returnsInt(){
HashMap shapes=新建HashMap();
放置(“圆圈”,新圆圈());
返回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
    }
publicmap returnNewMap(){
HashMap shapes=新建HashMap();
放置(“圆圈”,新圆圈());
return shapes;//这是返回的HashMap
}

您可以使用双括号初始化,如下所示:

Map<String,Object> map = new HashMap<String,Object>() {
 {
    put("circle", new Circle());
 }
};
Map Map=newhashmap(){
{
放置(“圆圈”,新圆圈());
}
};
此代码不在方法或
静态块中。此代码不能在类的主体中自由执行。这将导致编译错误。

初始化块:

abstract class GeometricObject
{  
    HashMap<String, Object> shapes = new HashMap<String,Object>();
    {
        shapes.put("Circle", new Circle());
    }
}
抽象类GeometricObject
{  
HashMap shapes=新建HashMap();
{
放置(“圆圈”,新圆圈());
}
}

我认为您的问题在于您正在抽象类中实例化HashMap,使该类成为非抽象类或子类,错误应该消失。我在很多类中使用过Hashmaps,从来没有遇到过问题,下面是Oracle抽象类的定义

抽象类与接口的比较


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

这是实现所需功能的一种方法,但不是唯一的方法

GeometricObject.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());
    }
}
import java.util.HashMap;

abstract class GeometricObject
{   
    HashMap<String, Object> shapes = new HashMap<String,Object>(); //error
    shapes.put("Circle", new Circle()); //error
}
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);
    }
}
import java.util.HashMap;
类几何对象
{   
publicstatichashmap提供menewshapedude(){
HashMap shapes=新建HashMap();
放置(“圆圈-1”,新圆圈());
放置(“圆圈-2”,新圆圈());
放置(“圆圈-3”,新圆圈());
返回形状;
}
}
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());
    }
}
import java.util.HashMap;

abstract class GeometricObject
{   
    HashMap<String, Object> shapes = new HashMap<String,Object>(); //error
    shapes.put("Circle", new Circle()); //error
}
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);
    }
}
import java.util.HashMap;
公开课演示{
公共静态void main(字符串args[]){
HashMap shapes=GeometricObject.giveMeNewShapesDude();
system.out.println(“形状:“+Shapes”);
}
}
在此之后,只需执行一个步骤,学习。

import java.util.HashMap;
抽象类几何对象
{   
散列图形状;
{shapes=newhashmap(){{
放置(“圆圈”,新圆圈());
放置(“方形”,新方形());
}};}
}

您的代码“GeometricObject.java”不在方法中。这是不正确的哇!在很短的时间内,8个答案回答了一个质量有问题的问题。由于您的评论
//错误
(第一条),我(现在仍然)感到困惑。因为删除
shapes.put…
行肯定会给你一个语法正确的答案…请检查-这通常不是一个好主意。我认为这对于他的用例来说是好主意。我不认为在每种情况下这都是一个坏主意。我提供链接只是为了提高人们对这种构造真正含义的认识。实际尝试代码时,向上投票对您有利。。。以
新对象()结束(
…:-)@Hille
new Object()
:)-不错,我以前尝试过这种变体,但我仍然不了解单大括号和双大括号之间的区别。双大括号:初始化块