0

HashMaps をいじってみたところ、main() を持つクラスで HashMaps をインスタンス化すると、main を持たないクラスでインスタンス化すると動作が異なることに気付きました。

デモ.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());
    }
}

GeometryObject.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 を初期化する正しい方法は何ですか?

4

7 に答える 7

1

初期化ブロック:

abstract class GeometricObject
{  
    HashMap<String, Object> shapes = new HashMap<String,Object>();
    {
        shapes.put("Circle", new Circle());
    }
}
于 2015-01-30T23:41:29.837 に答える
0

これは、あなたが望むことを行うための 1 つの方法ですが、唯一の方法ではありません。

GeometryObject.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;
    }
}

デモ.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 言語を学ぶことだけです。

于 2015-01-30T23:48:49.923 に答える
0

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
    }
于 2015-01-30T23:35:41.367 に答える
-1

あなたが問題としているのは、抽象クラス内で HashMap をインスタンス化し、クラスを非抽象化またはサブクラス化すると、エラーが解消されるはずだと思います。私は多くのクラスでハッシュマップを使用してきましたが、問題はありませんでした。これは、Oracle の抽象クラスの定義です。

インターフェイスと比較した抽象クラス

抽象クラスはインターフェイスに似ています。それらをインスタンス化することはできず、実装の有無にかかわらず宣言されたメソッドが混在している可能性があります。ただし、抽象クラスを使用すると、静的でも最終でもないフィールドを宣言し、パブリック、プロテクト、およびプライベートの具象メソッドを定義できます。インターフェイスを使用すると、すべてのフィールドが自動的に public、static、および final になり、(既定のメソッドとして) 宣言または定義するすべてのメソッドが public になります。さらに、抽象かどうかに関係なく、拡張できるクラスは 1 つだけですが、インターフェイスはいくつでも実装できます。

于 2015-01-30T23:44:02.933 に答える