重载包含显式构造函数的类,调用super()

时间:2017-08-12 13:08:34

标签: java constructor

似乎如果程序员提供构造函数,并且使用了对super()的调用,则不能在该类中调用其他构造函数(即它不能被重载)。这是Java固有的正常行为吗?为什么呢?

abstract class Four {
     Four (  ) { }
     Four (int x) { }
    }
class Three extends Four  {
    public Three ( String name) { }
    Three (int t, int y) { }
    }
class Two extends Three {
    Two ( ) { super ( "number");  } 
//  Two (int t, int y) { }  //causes an error when uncommented
    }
class One extends Two {
    public static void main (String [ ] args) {
        new One ( ); 
        }
    }

1 个答案:

答案 0 :(得分:5)

  

在该类中不能调用其他构造函数(即它不能重载)。

这根本不是真的。你的Two(int t, int y)构造函数的问题在于它没有显式链接到任何构造函数,这意味着存在一个隐式super()调用 - 由于Three 1 。您可以通过两种方式解决这个问题:

  • 直接链接到超级构造函数

    Two (int t, int y) {
        super("number");
    } 
    
  • 链接到同一类中的构造函数

    Two (int t, int y) {
        this();
    } 
    

1 它不一定是无参数的 - 严格来说 - 如果你添加一个Three(String... values)构造函数,那没关系。您需要有一个可以使用空参数列表调用的构造函数。