0

なぜこのエラーが発生するのかわかりません。メモ帳で作業し、cmd を使用して javac を実行します (明らかに、ファイルにさらに多くの情報が必要です)。もっとリンクする必要がある場合は、できます。私のエラーは、現在をスーパークラスにリンクしようとしている「setCruiseShip」で発生しています。エラー: スーパーへの呼び出しは、コンストラクターの最初のステートメントである必要があります。

class Ship
{ protected String name;
  protected float speed;
  protected int year;

  public Ship() {name=""; speed=year=0;}
  public Ship(String n, float sp, int y) {name=n; speed=sp; year=y;}
  public String getName()  {return name;}
  public float  getSpeed() {return speed;}
  public int    getYear()  {return year;}
  public void   setShip(String n, float sp, int y) {name=n; speed=sp; year=y;}
  public String toString() {return "Ship named "+name+ " with max speed of " 
                           +speed+ " was built in " +year;}
}

class CruiseShip extends Ship
{ protected int maxpass;

  public CruiseShip() {super(); maxpass=0;}
  public CruiseShip(String n, float sp, int y, int mp) {super(n, sp, y);
                                                        maxpass=mp;}
  public int  setMaxpass(int mp) {maxpass=mp;}
  public void setCruiseShip(String n, float sp, int y, int mp){super(n,sp,y);
                                                               maxxpass=mp;}
  public String toString() { return super.toString() +" carries "
                            +maxpass+ "  passengers";}
} 
4

3 に答える 3

1

class Ship。という名前のメソッドはありませんsetCruiseShip。おそらく必要なのは、setShipメソッドを呼び出すことです。交換

super(n,sp,y);

setShip(n,sp,y);
于 2013-03-11T08:51:58.633 に答える
0

スーパー コンストラクターは、子クラスのコンストラクターからのみ呼び出すことができます (メソッドからではありません)。以下に示す修正およびコンパイルされたプログラム

class Ship {
    protected String name;
    protected float speed;
    protected int year;

    public Ship() {
        name = "";
        speed = year = 0;
    }

    public Ship(String n, float sp, int y) {
        name = n;
        speed = sp;
        year = y;
    }

    public String getName() {
        return name;
    }

    public float getSpeed() {
        return speed;
    }

    public int getYear() {
        return year;
    }

    public void setShip(String n, float sp, int y) {
        name = n;
        speed = sp;
        year = y;
    }

    public String toString() {
        return "Ship named " + name + " with max speed of " + speed
                + " was built in " + year;
    }
}

class CruiseShip extends Ship {
    protected int maxpass;

    public CruiseShip() {
        super();
        maxpass = 0;
    }

    public CruiseShip(String n, float sp, int y, int mp) {
        super(n, sp, y);
        maxpass = mp;
    }

    public int setMaxpass(int mp) {
        maxpass = mp;
    }

    public void setCruiseShip(String n, float sp, int y, int mp) {
        setShip(n, sp, y);
        maxpass = mp;
    }

    public String toString() {
        return super.toString() + " carries " + maxpass + "  passengers";
    }
}
于 2013-03-11T09:04:51.650 に答える
0

super(somevalues...)サブクラスのコンストラクターから呼び出すことができます。Java はメソッドからの呼び出しを許可しませんsuper(somevalues...)。また、サブクラスでコンストラクターを定義する場合、その最初のステートメントはsuper()/super(somevalues) コンストラクターまたはのいずれかである必要がありますthis(somevalues...)。これを行わない場合、コンパイラはデフォルトの引数なしのスーパー コンストラクターを暗黙的に追加します。

this() コンストラクターのオーバーロードを意味します。
そして与えられた事実は

public void setCruiseShip(String n, float sp, int y, int mp){super(n,sp,y);

サブクラスのコンストラクタではありません。

コンストラクターdefinitionは、コンストラクター名はクラス名と同じである必要があり (「すべき」とは言っていません)、戻り値の型がなく、任意のアクセス修飾子が許可されます (private、default、protected、public など)。

setCruiseShipと同じではありませんCruiseShip

于 2013-03-11T09:05:12.773 に答える