是否有可能为Java中的特定实例(参数化)调用SubClass和SuperClass的默认和参数化构造函数?



我正在尝试以下场景:

public class SuperClass {
    public SuperClass(){
        System.out.println("Super Constructor");
    }
    public SuperClass(int i){
        this();
        System.out.println("Parameterized Super Constructor");
    }
}
public class SubClass extends SuperClass{
    public SubClass(){
        System.out.println("Sub Constructor");
    }
    public SubClass(int i){
        super(i); /* Need to call **this()** here .. Is this possible? */
        System.out.println("Parameterized  Sub Constructor");
    }
}
public class Inheritance {
    public static void main(String[] args) {
        SubClass sub=new SubClass(5);
    }
}

在这种情况下如何调用默认构造函数和参数化构造函数?

如果在非参数化构造函数中有需要同时调用的功能,那么我建议您将其移出,例如,移到两个构造函数都可以调用的private void init()函数中。

答案很简单,不能同时调用thissuper(i)。Java只允许在一个构造函数的开头链接另一个构造函数。

你可以按照DFreeman的建议去做,或者Java还有另一个技巧;

public class SuperClass {
    public SuperClass(){
        System.out.println("Super Constructor");
    }
    public SuperClass(int i){
        this();
        System.out.println("Parameterized Super Constructor");
    }
}
public class SubClass extends SuperClass{
    {
        /*
         * Default initialization block.
         * During compile time, this block will get copy to each of the constructor.
         */
        System.out.println("Sub Constructor");
    }
    public SubClass(int i){
        super(i); 
        System.out.println("Parameterized  Sub Constructor");
    }
}
public class Inheritance {
    public static void main(String[] args) {
        SubClass sub=new SubClass(5);
    }
}

因此,如果您有一些常见的初始化(如分配默认值),您可以利用默认初始化块。

但是,如果需要在一个构造函数中调用不同的参数化构造函数,那么您就不走运了。你要么必须重新构造你的构造函数,要么调用一些通用的私有初始化方法。

相关内容

最新更新