Java中的默认构造函数和继承

use*_*155 51 java inheritance initialization default-constructor

我有一个关于Java中的默认构造函数和继承的问题.

通常,如果你编写一个类并且不包含任何构造函数,Java会自动为你提供一个默认构造函数(一个没有参数),它初始化类的所有实例变量(如果有的话)都有一些默认值(0,null或者是假的.但是,如果使用某些参数编写构造函数,并且不编写任何默认构造函数,则Java不提供默认构造函数.我的问题是:类继承自其他类的情况是什么 - 如果我编写一个带有一些参数的构造函数,但是不包含默认构造函数,它们是否继承了超类的默认构造函数?

pau*_*ray 61

  1. 如果不创建构造函数,则会自动创建默认的空构造函数.

  2. 如果任何构造函数没有显式调用super或this构造函数作为其第一个语句,则会自动添加对super()的调用.

总是.

  • 链接被打破(谢谢,Oracle),这里有新的链接:http://docs.oracle.com/javase/specs/jls/se7/html/jls-8.html#jls-8.8.9和http:/ /docs.oracle.com/javase/specs/jls/se7/html/jls-8.html#jls-8.8.7 (2认同)
  • @Stoffe:由于您的评论,我建议进行编辑以修复链接。您可以通过建议编辑来获得声誉,那么为什么将来不这样做呢? (2认同)

sta*_*lue 52

构造函数不是继承的.

此外,字段的初始化由虚拟机完成,而不是默认构造函数.默认构造函数只调用超类的默认构造函数,而Object的默认构造函数为空.这种设计的优点是无法访问未初始化的字段.


Pet*_*rey 11

除非你使用super(...),否则构造函数会调用其父级的空构造函数.注意:它在所有类上执行此操作,甚至是扩展Object的类.

这不是继承,子类不会获得具有相同参数的相同构造函数.但是,您可以添加调用超类的构造函数之一的构造函数.


小智 6

基本规则是对构造函数的调用(或调用)应该是JVM需要执行的第一个语句,

所以当你有一个只有参数化构造函数且没有默认构造函数的超类,并且基类没有对超类的参数化构造函数的显式调用时,JVM提供了super(); 由于没有超类的默认构造函数,因此抛出错误的调用,所以我们要么在超类中提供默认构造函数,要么在基类构造函数中显式调用超类的参数化构造函数.当我们给出显式调用时,那么JVM就懒得把行放到super(); 因为构造函数调用应该是方法的第一个语句,这是不可能发生的(因为我们的显式调用).


das*_*ght 5

Java语言规范的第8.8.9节详细解释了发生了什么:

如果类不包含构造函数声明,则隐式声明默认构造函数.顶级类,成员类或本地类的默认构造函数的形式如下:

  • 默认构造函数具有与类相同的可访问性(第6.6节).
  • 默认构造函数没有形式参数,除非在非私有内部成员类中,默认构造函数隐式声明一个形式参数,表示该类的直接封闭实例(§8.8.1,§15.9.2,§15.9.3) ).
  • 默认构造函数没有throws子句.
  • 如果声明的类是原始类Object,则默认构造函数具有空体.否则,默认构造函数只调用不带参数的超类构造函数.

你可以看到这里没有继承:所有它都是带有隐式声明的默认构造函数的"编译器魔术".规范还明确指出,只有当类根本没有构造函数时才添加默认构造函数,这意味着你的问题的答案是"否":一旦你给一个类一个构造函数,就可以访问它的默认构造函数超类失去了.