4

私はスーパークラスを持っています、VehicleそれはサブクラスPlaneCarです。final string name;車両は、コンストラクターからのみ設定できるフィールドを持つクラスから拡張されます。

このフィールドをクラスの名前に設定したいので、Carの名前はCar、PlaneはPlane、VehicleはVehicleになります。私が最初に考えたのは:

public Vehicle() {
    super(getClass().getSimpleName()); //returns Car, Plane or Vehicle (Subclass' name)
}

しかし、これは私にエラーを与えます:Cannot refer to an instance method while explicitly invoking a constructor

name手動で文字列として渡さずに、フィールドをクラス名に設定するにはどうすればよいですか?

4

3 に答える 3

8

あなたはそれをする必要はありません。

getClass().getSimpleName()基本コンストラクターから直接呼び出すことができます。

于 2012-06-07T13:44:44.500 に答える
1

これを行うこともできます

   //Vehicle constructor
    public Vehicle() {
        super(Vehicle.class.getSimpleName()); 
    }

    //Plane constructor
    public Plane(){
        super(Plane.class.getSimpleName());
    }
于 2012-06-07T13:49:54.330 に答える
0

コンパイラが言ったように、「super()」メソッドの呼び出しの一部としてインスタンス メソッドを呼び出すことはできません。

ただし、静的メソッドを呼び出すことはできます。また、スーパー コンストラクター コード自体では、いつでも "getClass()" を呼び出すことができ、実際のインスタンス タイプが返されます。

public class A {
  public A() {
      System.out.println("class: " + getClass().getName());
  }
}

public class B extends A {
  public B() {
      super();
  }
}

new A(); --> "class: A"
new B(); --> "class: B"
于 2012-06-07T14:25:02.823 に答える