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

程序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
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值