java:为什么我必须在构造函数的第一行写super()

java:为什么我必须在构造函数的第一行写super(),java,class,inheritance,Java,Class,Inheritance,可能重复: 我刚在学校学的,但老师不知道为什么 我可以想出一些很好的理由,但我认为有些情况下,初始化可以在构造函数中稍后完成——例如,在使用母类中的变量之前。好的,变量应该从一开始就初始化,但这并不总是必要的 我猜还有更多的原因说明为什么必须将super()放在构造函数的第一行 那么,当我继承一个类时,为什么我必须在构造函数的第一行中编写super()?在您开始处理自己的类之前,您从中继承的类需要能够完成其构造 如果不这样做,你可能会做很多“糟糕”的事情,例如 在构造函数运行之前,将此传递给其

可能重复:

我刚在学校学的,但老师不知道为什么

我可以想出一些很好的理由,但我认为有些情况下,初始化可以在构造函数中稍后完成——例如,在使用母类中的变量之前。好的,变量应该从一开始就初始化,但这并不总是必要的

我猜还有更多的原因说明为什么必须将super()放在构造函数的第一行


那么,当我继承一个类时,为什么我必须在构造函数的第一行中编写super()?

在您开始处理自己的类之前,您从中继承的类需要能够完成其构造

如果不这样做,你可能会做很多“糟糕”的事情,例如

  • 在构造函数运行之前,将此传递给其他地方使用基类的另一个方法。这将打破许多假设

  • 调用尚未正确“设置”的多态函数。与类本身所做的任何事情一样,实现也可能使用构造函数调用来处理实现内部

    在对象被构造之前访问它是不好的,就像炸鸡是一种你真的不想在炸鸡之前访问(吃)的鸡一样

  • 访问
    受保护的
    /
    公共
    基类试图承诺的成员变量将始终初始化为某个状态


  • 类承诺它的任何实例都将始终处于某个给定状态是完全合理的。如果在调用构造函数之前有机会做一些事情,那么就没有办法兑现这样的承诺。本质上,如果“is-a”关系是“is-a”关系,那么它实际上就不会成立“那还不是真的吗

    在您开始使用自己的类之前,您从中继承的类需要能够完成其构造

    如果不这样做,你可能会做很多“糟糕”的事情,例如

  • 在构造函数运行之前,将该传递给其他地方使用基类的另一个方法。这将打破许多假设

  • 调用尚未正确“设置”的多态函数。与类本身所做的任何事情一样,实现也可能使用构造函数调用来处理实现内部

    在对象被构造之前访问它是不好的,就像炸鸡是一种你真的不想在炸鸡之前访问(吃)的鸡一样

  • 访问
    受保护的
    /
    公共
    基类试图承诺的成员变量将始终初始化为某个状态


  • 类承诺它的任何实例都将始终处于某个给定状态是完全合理的。如果在调用构造函数之前你有机会做一些事情,那么就没有办法兑现这样的承诺。从本质上说,如果“是”的东西实际上还不是那个东西,那么“是-是”的关系就不会真正成立

    除了awoodlands之外,回答:您不必编写super(),因为Java编译器将自动调用层次结构上的所有默认构造函数


    异常:如果基类中没有默认构造函数,除了awoodland之外,还必须使用
    super(ConstructorArgs)
    调用自定义构造函数回答:不必编写super(),因为Java编译器将自动调用层次结构上的所有默认构造函数


    异常:如果基类中没有默认构造函数,则必须使用
    super(ConstructorArgs)调用自定义构造函数

    “并非总是必需的”;但是你能想出一个不应该这样做的原因吗?我的意思是:你可以在使用变量或对象之前声明一行。那么,为什么不能用super()实现这一点呢?阿伍德兰德给了我一个很好的回答,“不一定必要”;但是你能想出一个不应该这样做的原因吗?我的意思是:你可以在使用变量或对象之前声明一行。那么,为什么不能用super()实现这一点呢?阿伍德兰德给了我一个非常好的答案。这解释了很多。谢谢根据@quaylar的回答(这应该是一个注释,因为它在回答问题时不完整),在超类没有构造函数参数的构造函数开头编写
    super()
    ,这只是噪音,是不必要的。你能把这个加到你的答案里吗?这解释了很多。谢谢根据@quaylar的回答(这应该是一个注释,因为它在回答问题时不完整),在超类没有构造函数参数的构造函数开头编写
    super()
    ,这只是噪音,是不必要的。你能把这个加到你的答案里吗?