2017-08-12 46 views
-1

看来,如果程序员提供了构造函数,并且使用对super()的调用,则不能在该类中调用其他构造函数(即,不要超载)。这是Java固有的正常行为吗?为什么?通过调用super()重载一个包含显式构造函数的类

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 (); 
     } 
    } 
+0

你能解释一下你的问题,指出你的例子中的细节吗? – ProgrammersBlock

+2

当超类没有零参数构造函数时,子类构造函数必须全部明确地调用'super'。 'Three'没有任何零参数构造函数,所以'Two'必须在其所有构造函数中调用'super'。 – 4castle

+0

@ProgrammersBlock类2中的重载构造函数在取消注释时会导致编译器错误。 @ Jon \ Skeet提供了解决方案。 – Michael

回答

5

没有其他的构造可以在类(即,它不能被重载)被调用。

这根本不是真的。 Two(int t, int y)构造函数的问题在于它没有显式链接到任何构造函数,这意味着有一个隐含的super()调用 - 由于在Three 中没有无参数构造函数而失败。直接

  • 链的超级构造

    Two (int t, int y) { 
        super("number"); 
    } 
    
  • 链的构造在同一类

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

:您可以修复有两种方式它不一定非参数化,严格来说 - 如果你添加一个Three(String... values)构造函数,那没关系。你需要有一个可以用空参数列表调用的构造函数。

相关问题