Java中的默认构造函数和inheritance
我有一个关于Java中的默认构造函数和inheritance的问题。
一般来说,如果你编写一个类而不包含任何构造函数,Java会自动为你提供一个默认的构造函数(一个没有参数),它初始化了类的所有实例variables(如果有的话)和一些默认值(0,null ,或者错误)。 但是,如果你编写了一个构造函数,并且有一些参数,并且你不写任何默认的构造函数,那么Java就不会提供默认的构造函数。 我的问题是:什么是类的情况下,从其他类inheritance – 如果我写一个构造函数的一些参数,但不包括默认的构造函数,他们是否inheritance了超类的默认构造函数?
-
如果您不构造构造函数, 则会自动创build默认的空构造函数 。
-
如果任何构造函数没有显式调用超级或此构造函数作为其第一条语句, 则会自动添加对super()的调用 。
总是。
构造函数不被inheritance。
此外,字段的初始化由虚拟机完成,而不是默认的构造函数。 默认的构造函数只是调用超类的默认构造函数,而Object的默认构造函数是空的。 这种devise的好处是没有办法访问未初始化的字段。
除非你使用超级(…)构造函数调用它的父级的空构造函数。 注意:它在你所有的类,甚至扩展对象的。
这不是inheritance,子类不具有相同的参数相同的构造函数。 但是,您可以添加调用超类的构造函数之一的构造函数。
基本规则是对构造函数的调用(或调用)应该是JVM需要执行的第一个语句,
所以当你有一个只有参数化构造函数的超类,没有默认构造函数,并且基类没有显式调用超类的参数化构造函数时,JVM提供了super(); 调用哪个抛出错误,因为没有超类的默认构造函数,所以要么在超类中提供默认构造函数,要么在基类构造函数中显式调用超类的参数化构造函数。 当我们给显式调用的时候,JVM就不用费心去把super(); 因为构造函数调用应该是方法的第一个语句,不会发生(因为我们的显式调用)。
Java语言规范第8.8.9节详细介绍了发生了什么事情:
如果一个类不包含构造函数声明,那么隐式声明一个默认的构造函数。 顶级类,成员类或本地类的默认构造函数的forms如下所示:
- 默认的构造函数与类(第6.6节)具有相同的可访问性。
- 默认的构造函数没有forms参数,除了在非私有的内部成员类中,默认的构造函数隐式地声明了一个formstypes的参数(§8.8.1,§15.9.2,§15.9.3 )。
- 默认的构造函数没有throws子句。
- 如果声明的类是原始类Object,那么默认的构造函数有一个空的主体。 否则,默认构造函数只是调用没有参数的超类构造函数。
你可以看到这里没有inheritance:所有这一切都是隐式声明的默认构造函数的“编译器魔术”。 该规范还明确指出,只有当类没有构造函数时才添加默认构造函数,这意味着您的问题的答案是“否”:一旦您给了一个类的构造函数,就可以访问它的默认构造函数超类丢失。
如果你提供了一个构造函数,那么Java将不会生成一个默认的空构造函数。 所以你的派生类将只能够调用你的构造函数。
默认构造函数不会将您的私有variables初始化为默认值。 certificate是可以编写一个没有默认构造函数的类,并将其私有成员初始化为默认值。 这是一个例子:
public class Test { public String s; public int i; public Test(String s, int i) { this.s = s; this.i = i; } public Test(boolean b) { // Empty on purpose! } public String toString() { return "Test (s = " + this.s + ", i = " + this.i + ")"; } public static void main (String [] args) { Test test_empty = new Test(true); Test test_full = new Test("string", 42); System.out.println("Test empty:" + test_empty); System.out.println("Test full:" + test_full); } }
拇指规则是子类应调用基类的任何构造函数。 所以如果你没有默认的const调用现有的子类。 另外明智地实现基类中的空const来避免编译问题
当我们不创build构造函数时,Java会自动创build一个默认的构造函数。 但是,当我们创build一个或多个具有参数的自定义构造函数时,Java不会创build任何默认的构造函数。 如果我们创build一个或多个构造函数,并且我们想创build一个没有任何构造函数参数的对象,我们必须声明一个空的构造函数。
你的问题的答案很简单。 隐式(不可见),任何构造函数中的第一个语句是'super();' 即直接将其更改为“this();”,“this(int)”,“this(String)”,“super(int)”,“super(String )'等'this();' 是当前类的构造函数。
会有编译时错误…因为编译器寻找默认的构造函数他超类,如果它不存在…它的错误…和程序将不会编译…