当前位置: 首页 > 知识库问答 >
问题:

继承的构造函数java:调用Super()必须是第一个语句

袁河
2023-03-14

我试图用Java做一些事情,但在做构造函数时遇到了问题。我的代码:

工件构造器

public Piece(Chessboard chessboard, Position position, Color color, String name, char symbol) {
    this.board = chessboard;
    this.position = position;
    this.color = color;
    this.name = name;
    this.symbol = symbol;
}

Bishop构造函数(从工件扩展):

    public Bishop(Chessboard board, Position position, Color color) {
        char symbole;
        if(color.equals(Color.BLACK)) 
            symbole = Symbol.BLACK_BISHOP.getCode();
        else 
            symbole = Symbol.WHITE_BISHOP.getCode();
    super(board, position, color, "Bishop", symbole);
}

当我尝试这样做时,我在超级调用中得到一个错误:“super()必须是构造函数体中的第一个语句”。

我看到的唯一修复方法是将super()调用中的“symbole”替换为一个表达式,该表达式将在函数“color”中获得正确的符号,但我无法做到这一点?

我的Symbol类只是一个枚举,其中有一个表示国际象棋代码的字段。所有部件的说明如下:COLOR\u-PIECE示例:BLACK\u-BISHOP

谢谢你的帮助


共有3个答案

麻宾白
2023-03-14

java中的超级关键字

java中的super关键字是一个引用变量,用于引用直接父类对象。

每当您创建子类的实例时,都会隐式创建父类的实例,即由超级引用变量引用。

java超级关键字的使用

1) super用于引用直接父类实例变量

3) super用于调用直接父类方法。

例如-

 class Example{  
  Example(){System.out.println("Example is created");}  
  }  

class Sample extends Example{  
  Sample(){  
   super();//will invoke parent class constructor  
   System.out.println("Sample is created");  
  }  
  public static void main(String args[]){  
   Sample b = new Sample(); 
   }
}  
澹台建华
2023-03-14

如Eran的答案所示,三元运算符可以解决这种情况下的问题。

但有时你不能用这种方式计算超级构造函数参数的值。对于这些情况,您可以使用私有静态辅助函数:

public class Bishop {
    private static char computeSymbol(Color color) {
         <complicated computation>
         return result;
    }

    public Bishop(Chessboard board, Position position, Color color) {
        super(board, position, color, "Bishop", computeSymbol(color));
    }
任文乐
2023-03-14

三元条件运算符可以解决您的问题:

public Bishop(Chessboard board, Position position, Color color) {
    super(board, position, color, "Bishop", color.equals(Color.BLACK)?Symbol.BLACK_BISHOP.getCode():Symbol.WHITE_BISHOP.getCode());
}
 类似资料:
  • 这个Super()的替代品是什么;我代码中的语句...因为它向我显示了一个名为:构造函数调用必须是构造函数中的第一个语句的错误。

  • 无法理解为什么会出现此错误。在记事本中工作,通过cmd运行javac(显然更多的是文件)。如果你需要我链接更多,我可以。我的错误发生在“setCruiseShip”中,我试图将电流链接到超类。错误:对super的调用必须是构造函数中的第一条语句。

  • 我一直收到这样一个错误:“对super的调用必须是构造函数中的第一条语句”。 问题是它是我的构造函数中的第一个语句。 这也是我的超级班级。 我做错了什么?

  • 问题内容: 我正在编写一个LoginRequest类的构造函数,该类扩展了一个名为JsobObjectRequest的类(来自Android的Volley框架,但这与问题完全无关) 使用此代码: 我收到错误:对super()的调用必须是构造函数主体中的第一条语句 相反,此代码可以正常编译: 但这实际上不是一回事吗?在这两种情况下,根据传递给子类构造函数的参数值,在调用超级构造函数之前都要进行一些简

  • 我正在编写一个LoginRequest类的构造函数,该类扩展了一个名为JsobObjectRequest的类(来自Android的凌空框架,但这与问题完全无关) 使用此代码: 我得到了一个错误:对super()的调用必须是构造函数体中的第一条语句 相反,这段代码编译得很好: 但事实上不是完全一样吗?在这两种情况下,在调用超级构造函数之前,都会根据传递给子类构造函数的参数值进行一些简单的计算。既然编

  • 如果将移到构造函数的最后一行,我不明白为什么下面的代码会显示错误。 我已经检查了很多关于StackOverflow的答案,但我仍然不能理解这其中的原因。请帮我用一些简单的例子和解释弄清楚这个错误。