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

时间:2015-09-26 18:12:28

标签: java inheritance constructor

尝试用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构造函数(从Piece扩展):

    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类只是一个包含字段code的枚举,表示棋子的代码。所有部分都表示为COLOR_PIECE示例:BLACK_BISHOP

感谢您的帮助

3 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分:4)

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

但有时您无法以这种方式计算超级构造函数参数的值。对于这些情况,您可以使用private static辅助函数:

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

答案 2 :(得分:0)

java中的超级关键字

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

无论何时创建子类实例,都会隐式创建父类的实例,即由超级引用变量引用。

java超级关键字的用法

1)super用于引用直接父类实例变量 2)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(); 
   }
}