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

时间:2016-07-07 13:41:50

标签: java inheritance

所以,假设我有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;
    }
}

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

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

2 个答案:

答案 0 :(得分:1)

如果字段不是最终字段,则可以在声明它们的位置指定默认值。所以代码看起来像:

jData = '<div class=\"hotspot F1hs sash\" id=\"F1\” >’

var radios = $(".rectangleRadios.active").children("input").val(); 

var windowName = $.urlParam('windowid’); // This is the F1. It comes from a URL parameter and will change from page to page.

var updateFrame = new RegExp(windowName+'hs','g’);  //Creates the F1hs

var id = new RegExp('\\" id=\\"'+windowName,'g’); // Creates the “  id=F1

答案 1 :(得分:0)

如果在构造函数的第一行没有对继承的构造函数的调用,则将调用继承类的默认构造函数。如果没有默认构造函数,那么你必须在构造函数的第一行定义它应该使用哪个超级构造函数。

public class A{

    public A(){

    }

    public A(String text){

    }

}

public class B extends A{

    public B(){
        //having nothing is same as super();
        //here you can also call the other constructor
        //super(""); is allowed
    }

    public B(String text){
        //having nothing is same as super();
        //but if you add a super(text) then you set this instance to super(text); instead
    }

}

public class C{

    public C(String text){

    }

}

public class D extends C{

    public D(){
        super();// this is incorrect and will not compile
    }

    public D(String text){
        super(text);//this is fine
    }

}

希望这会有所帮助。