Java默认构造函数的一些发现

来源:互联网 发布:英语 加油 知乎 编辑:程序博客网 时间:2024/04/29 09:03

程序1:

package com.org.demos;public class Base {    public Base(){        System.out.println("this is a Base Class!");    }}

程序2:

package com.org.demos;public class Child extends Base {    public Child () {        System.out.println("Child Class!");    }    public Child (String str) {        // super();        System.out.println("this is another constructor!" + str);    }    public static void main(String[] args) {        Child child = new Child ();    }}

这里写图片描述
上面的是两个很简单的程序说明了:如果继承父类的子类没有显示的调用super();子类的构造函数中仍然会自动先调用父类的无参构造函数。当然也可以自己添加有参的,如:super( int a);
如果在主函数中通过有参构造函数实例化,也会默认的先执行父类的无参构造函数。这在以后的继承是需要注意。另外补充一点,Java中不支持多继承。

程序3:

package com._09._30;class Meal{    public Meal(){        System.out.println("Meal constructor!");    }}class Bread{    public Bread(){        System.out.println("Bread constructor!");    }}class Cheese{    public Cheese(){        System.out.println("Cheese constructor!");    }}class Lunch extends Meal{    public Lunch(){        System.out.println("Lunch constructor!");    }}public class ConstructorDemo extends Lunch{    public ConstructorDemo(){        //super();        new Bread();        new Cheese();        new Lunch();        System.out.println("ConstructorDemo constructor!");    }    public static void main(String[] args) {        new ConstructorDemo();    }}

这里写图片描述
下面这段程序逻辑上或许看起来比上面的稍微复杂一点,其实本质上还是默认构造器的调用(子类总是会调用父类的构造器,不管程序员是否显示的使用super();)。在这个程序中,就涉及到构造器的递归调用,总是先调用基类的构造器。对于ConstructorDemo这个类,它的父类往上依次是Lunch、Meal,其中Meal是基类,因此肯定是先默认调用基类的构造器,再调用Lunch构造器,最后再依次执行ConstructorDemo的构造器中的代码。
有一种特殊情况就是当一个类没有显示的使用extends继承任何类的时候,此时该类的默认父类是Object这个超类(当然任何类的基类都是超类),此时会自动调用Object的构造器。如果有显示继承的话,就像上面的例子,并不会去调用Object的构造器。

最后想再补充一点,class A中定义了一个有参的构造器,如果class B想继承class A,则在class A这个父类中必须重新定义一个无参的构造器(任何定义了构造器的类,系统是不会再提供默认的无参构造器),否则会编译出错。原因很简单,还是上面说的这些,任何子类中的构造器都会默认的调用父类中的无参构造器。

如有误,请拍砖,相互学习!

0 0
原创粉丝点击