重载构造函数后总是执行一些代码

Always execute some code after overloaded constructors

我希望在这个子类的每个重载构造函数中执行一些代码(例如,"setBackground(Color.BLACK);")(或者我也可以表示 "some code" 必须在创建这个子类的实例后执行).但是这个 "some code" 只能在我们的子类中 used/called 并且只能出现一次。并且该子类的每个重载构造函数都必须始终调用超类的适当重载构造函数。

public class JLProgressBar extends JProgressBar{

    public JLProgressBar(){

        super();

    }

    public JLProgressBar(int orient){

        super(orient);

    }

    public JLProgressBar(int min, int max){

        super(min,max);

    }

    public JLProgressBar(int orient, int min, int max){

        super(orient,min,max);

    }

    public JLProgressBar(BoundedRangeModel newModel){

        super(newModel);

    }

}

试试这个。每次加载 class 时都会调用 static 块。


public class JLProgressBar extends JProgressBar{

    static {
        System.out.println("hhh");
    }

    public JLProgressBar(){
        super();
    }

    public JLProgressBar(int orient){
        super(orient);
    }

    public JLProgressBar(int min, int max){
        super(min,max);
    }

    public JLProgressBar(int orient, int min, int max){
        super(orient,min,max);
    }

    public JLProgressBar(BoundedRangeModel newModel){
        super(newModel);
    }
}

您可以使用实例初始化程序。此初始值设定项可以处理或您需要的所有构造函数变体的 "some code"。

public class JLProgressBar extends JProgressBar{

    public JLProgressBar(){
        super();
    }

    public JLProgressBar(int orient){
        super(orient);
    }

    public JLProgressBar(int min, int max){
        super(min,max);
    }

    public JLProgressBar(int orient, int min, int max){
        super(orient,min,max);
    }

    public JLProgressBar(BoundedRangeModel newModel){
        super(newModel);
    }

    // instance initializer (called for every constructor
    {
        // "some code"
    }
}

注意:此实例初始化程序将运行超级构造函数之后,但构造函数中的任何其他代码之前。所以

public class Bar
{
    protected int a;

    public Bar()
    {
        a = 2;
        System.out.println(a);
    }

    {
        a = 1;
        System.out.println(a);
    }
}

public class Foo extends Bar
{
    public Foo()
    {
        super();
        a = 4;
        System.out.println(a);
    }

    {
        a = 3;
        System.out.println(a);
    }
}

public static void main(String[] args)
{
    new Foo();
}

... 将打印

1
2
3
4

正在将评论转换为答案以备将来参考。

Java 的 Initialiser blocks 应该可以解决问题。这些在调用 super 之后直接注入到每个构造函数中,这(在您提供的示例中)应该涵盖在适当的时间发生的事情。此外,这些只会 运行 一次,并且对于每个创建的实例 保证 到 运行 (无论是否有人 class 是你的class,等等)。

例如

public class YourJProgressBar extends JProgressBar {

    public YourJProgressBar() {
        super();
    }

    {
        // Whatever code you want in here, will run immediately after the call
        // to 'super' in any given constructor.  Note, in cases where the call
        // to 'super' is implicit, it will run after that implicit call
        // instead of just never running.
        this.setValue(10);
    }
}