簡體   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