我正在尝试以下场景:
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()
函数中。
答案很简单,不能同时调用this
和super(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);
}
}
因此,如果您有一些常见的初始化(如分配默认值),您可以利用默认初始化块。
但是,如果需要在一个构造函数中调用不同的参数化构造函数,那么您就不走运了。你要么必须重新构造你的构造函数,要么调用一些通用的私有初始化方法。