如何在不编写重复代码的情况下处理继承链中的默认值?

所以假设我有A类,它的定义如下:

 public class A{
    private int x;

    public A(){
        this(13);
    }
    public A(int x){
        this.x = x;
    }
}

然后我有一个需要实现y的B类,所以像这样:

public class B extends A{
    private int y;

    public B(){

    }
    public B(int x){
        this(x, 0);
    }
    public B(int x, int y){
        super(x);
        this.y = y;
    }
}

我的问题是:我在公共B()做什么?我是否调用super()以便A分配默认值/执行任何操作,然后在该构造函数中执行另一个this.y = y,或者我将其调用(13)?

这两种方法似乎都需要一些不好的做法.一个人让我在两个地方写这个.y = y.另一个要求我重复默认值,每次更改默认值时都需要更改.

最佳答案 如果字段不是最终字段,则可以在声明它们的位置分配默认值.所以代码看起来像:

class A{
  private int x = 13;
  public A(){
    //use default value for x
  }
  public A(int x){
    this.x = x;
  }
}

class B extends A {
  private int y = 0;
  public B(){ 
    //use default value for x and y
  }
  public B(int x){
    super(x);
    //use default value for y
  }
  public B(int x, int y){
    super(x);
    this.y = y;
  }
}
点赞