初始化对象并将对象放入 HashMap 的不同方法
Different ways to initialize and put objects to HashMaps
我一直在研究 HashMaps,并意识到在具有 main() 的 class 中实例化 HashMaps 的行为与在没有 main 的 class 中实例化时的行为不同。
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());
}
}
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() 的 class 中初始化 HashMap 的正确方法是什么?
Main 只是一个 void(方法),就像任何其他方法一样,只是它首先执行。如果您想像这样放置代码,请将其放入 void 或任何其他方法中 returning 任何类型(可以是静态的或实例 - 无关紧要)。
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;
}
您还可以 return 您的 HashMap:
public Map returnNewMap(){
HashMap<String, Object> shapes = new HashMap<String,Object>();
shapes.put("Circle", new Circle());
return shapes; //here's your HashMap returned
}
您可以像这样使用双括号初始化:
Map<String,Object> map = new HashMap<String,Object>() {
{
put("circle", new Circle());
}
};
shapes.put("circle", new Circle());
此代码不在方法或 static
块中。这段代码不能在class的body中随意执行。这将导致编译错误。
初始化块:
abstract class GeometricObject
{
HashMap<String, Object> shapes = new HashMap<String,Object>();
{
shapes.put("Circle", new Circle());
}
}
我认为您的问题是您在抽象 class 中实例化 HashMap,使 class 非抽象或子 class 它并且错误应该消失。我在许多 classed 中使用过 Hashmap,但从未遇到过问题,这里是来自 Oracle 的抽象 class 的定义,
抽象类 与接口相比
抽象classes类似于接口。您不能实例化它们,并且它们可能包含声明有或没有实现的混合方法。但是,使用抽象 classes,您可以声明非静态和最终的字段,并定义 public、protected 和 private 具体方法。对于接口,所有字段自动为 public、static 和 final,并且您声明或定义(作为默认方法)的所有方法都是 public。此外,您只能扩展一个 class,无论它是否是抽象的,而您可以实现任意数量的接口。
这是一种方法,但不是唯一的方法。
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;
}
}
Demo.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 language。
import java.util.HashMap;
abstract class GeometricObject
{
HashMap<String, Object> shapes;
{shapes = new HashMap<String,Object>(){{
put("Circle", new Circle());
put("Square", new Square());
}};}
}
我一直在研究 HashMaps,并意识到在具有 main() 的 class 中实例化 HashMaps 的行为与在没有 main 的 class 中实例化时的行为不同。
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());
}
}
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() 的 class 中初始化 HashMap 的正确方法是什么?
Main 只是一个 void(方法),就像任何其他方法一样,只是它首先执行。如果您想像这样放置代码,请将其放入 void 或任何其他方法中 returning 任何类型(可以是静态的或实例 - 无关紧要)。
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;
}
您还可以 return 您的 HashMap:
public Map returnNewMap(){
HashMap<String, Object> shapes = new HashMap<String,Object>();
shapes.put("Circle", new Circle());
return shapes; //here's your HashMap returned
}
您可以像这样使用双括号初始化:
Map<String,Object> map = new HashMap<String,Object>() {
{
put("circle", new Circle());
}
};
shapes.put("circle", new Circle());
此代码不在方法或 static
块中。这段代码不能在class的body中随意执行。这将导致编译错误。
初始化块:
abstract class GeometricObject
{
HashMap<String, Object> shapes = new HashMap<String,Object>();
{
shapes.put("Circle", new Circle());
}
}
我认为您的问题是您在抽象 class 中实例化 HashMap,使 class 非抽象或子 class 它并且错误应该消失。我在许多 classed 中使用过 Hashmap,但从未遇到过问题,这里是来自 Oracle 的抽象 class 的定义,
抽象类 与接口相比
抽象classes类似于接口。您不能实例化它们,并且它们可能包含声明有或没有实现的混合方法。但是,使用抽象 classes,您可以声明非静态和最终的字段,并定义 public、protected 和 private 具体方法。对于接口,所有字段自动为 public、static 和 final,并且您声明或定义(作为默认方法)的所有方法都是 public。此外,您只能扩展一个 class,无论它是否是抽象的,而您可以实现任意数量的接口。
这是一种方法,但不是唯一的方法。
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;
}
}
Demo.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 language。
import java.util.HashMap;
abstract class GeometricObject
{
HashMap<String, Object> shapes;
{shapes = new HashMap<String,Object>(){{
put("Circle", new Circle());
put("Square", new Square());
}};}
}