我有一个关于Java中的默认构造函数和继承的问题.
通常,如果你编写一个类并且不包含任何构造函数,Java会自动为你提供一个默认构造函数(一个没有参数),它初始化类的所有实例变量(如果有的话)都有一些默认值(0,null或者是假的.但是,如果使用某些参数编写构造函数,并且不编写任何默认构造函数,则Java不提供默认构造函数.我的问题是:类继承自其他类的情况是什么 - 如果我编写一个带有一些参数的构造函数,但是不包含默认构造函数,它们是否继承了超类的默认构造函数?
如果不创建构造函数,则会自动创建默认的空构造函数.
如果任何构造函数没有显式调用super或this构造函数作为其第一个语句,则会自动添加对super()的调用.
总是.
构造函数不是继承的.
此外,字段的初始化由虚拟机完成,而不是默认构造函数.默认构造函数只调用超类的默认构造函数,而Object的默认构造函数为空.这种设计的优点是无法访问未初始化的字段.
除非你使用super(...),否则构造函数会调用其父级的空构造函数.注意:它在所有类上执行此操作,甚至是扩展Object的类.
这不是继承,子类不会获得具有相同参数的相同构造函数.但是,您可以添加调用超类的构造函数之一的构造函数.
基本规则是对构造函数的调用(或调用)应该是JVM需要执行的第一个语句,
所以当你有一个只有参数化构造函数且没有默认构造函数的超类,并且基类没有对超类的参数化构造函数的显式调用时,JVM提供了super(); 由于没有超类的默认构造函数,因此抛出错误的调用,所以我们要么在超类中提供默认构造函数,要么在基类构造函数中显式调用超类的参数化构造函数.当我们给出显式调用时,那么JVM就懒得把行放到super(); 因为构造函数调用应该是方法的第一个语句,这是不可能发生的(因为我们的显式调用).
Java语言规范的第8.8.9节详细解释了发生了什么:
如果类不包含构造函数声明,则隐式声明默认构造函数.顶级类,成员类或本地类的默认构造函数的形式如下:
默认构造函数具有与类相同的可访问性(第6.6节).
默认构造函数没有形式参数,除非在非私有内部成员类中,默认构造函数隐式声明一个形式参数,表示该类的直接封闭实例(§8.8.1,§15.9.2,§15.9.3) ).
默认构造函数没有throws子句.
如果声明的类是原始类Object,则默认构造函数具有空体.否则,默认构造函数只调用不带参数的超类构造函数.
你可以看到这里没有继承:所有它都是带有隐式声明的默认构造函数的"编译器魔术".规范还明确指出,只有当类根本没有构造函数时才添加默认构造函数,这意味着你的问题的答案是"否":一旦你给一个类一个构造函数,就可以访问它的默认构造函数超类失去了.