I would like to add few more points to the previous answers with respect to design.
If you are following the approach that chess board has the information about piece positioning, and piece is just type and have information about its type of movement and whether it can be blocked or not.
Considering this, Piece abstract class should not have attribute 'color'. As board is responsible for knowing at which place which piece is there and what is the actual colour of the piece.
public abstract class Piece {
    private char color; // It can be removed.
As the Piece is actually providing a contract about its movement, You should follow approach of interface implementation and can define Piece as an interface with contract method of movement and which can be implemented by type of piece King(K) , Knight(N) , Bishop(B) etc and these classes will be provide the implementation about there movement
public interface Piece{
    //for checking the move is valid or not
    boolean canMove(int srcX, int srcY, int destX, int destY, String[][] board);
    //for checking whether the movement is blocked by any piece in between or not
    //i.e. Knight won't get blocked, But other pieces can get blocked if any piece is in between the path
    boolean isBlocked(int srcX, int srcY, int destX, int destY, String[][] board);
}
Other normal validation like source/ destination is in bound , source has valid piece or not. can be handled as separate validation class which can follow Chain of responsibility design pattern. Implementation i am leaving to you.
Please updateopen a new question with these changes, if you agree with the pointspoints; then we can look in depth for the other comments.