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