簡體   English   中英

錯誤:超級必須是構造函數中的第一條語句

[英]error: Super must be first statement in constructor

無法弄清楚為什么我收到此錯誤。 在記事本中工作,通過cmd運行Javac(顯然對文件而言更多)。 如果您需要我鏈接更多,我可以。 我的錯誤發生在“ setCruiseShip”,我試圖將當前鏈接鏈接到超類。 錯誤:對super的調用必須是構造函數中的第一條語句。

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";}
} 

class Ship沒有名為setCruiseShip方法。 您可能想要的是調用setShip方法。 更換

super(n,sp,y);

setShip(n,sp,y);

超級構造函數只能從子類的構造函數調用(不能從任何方法調用)。 下面給出了經過修改和編譯的程序

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";
    }
}

可以從子類的構造函數中調用super(somevalues...) Java不允許從方法中調用super(somevalues...) 同樣,當您在子類中定義構造函數時,其第一條語句應該是super()/super(somevalues)構造函數或this(somevalues...) 如果不這樣做,則編譯器會隱式添加默認的no-arg超級構造函數。

this()表示構造函數重載。
給定的事實是

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

不是子類的構造函數。

構造函數definition是,構造函數名稱必須與沒有返回類型的類名稱相同(我不是說“應該”),並且允許使用任何訪問修飾符(例如private,default,protected,public)。

所以setCruiseShipCruiseShip

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM