为什么要有无参构造方法

无参构造器也叫无参构造方法,在我们创建类时候,可以不用写构造方法,因为系统会默认给我们提供一个无参构造方法,如果我们自己写了无参构造方法,那么我们这个就将默认的覆盖了。那么为什么一定要有这么一个无参构造方法呢?

1、因为我们在实例对象的时候,都要不断的向上(父类)回溯,回溯到Object(),要想顺利的回溯到Object,就必须给指定一条通路,如果没有,就用默认的 super()。

下面是我的一个测试,共有 GrandPa、Father和Son 3个类,

我现在在 main方法里 执行这条语句。Son son = new Son();  控制台的输出结果如下:

由结果可知,一定不断的回溯到了Object,只不过是没有打印语句而已。若我们不指定调用父类的哪个构造方法。就会调用默认的无参构造方法,当然这个调用语句是在方法体的第一行。

如上上图所示,加不加 super()结果是一样的,因为默认有这一行。

2、那我把父类的无参构造方法去了还能回溯吗?当然可以,因为会默认有一个。 把Father的无参构造方法注释掉,控制台输出如下:我是爷爷的无参构造器
           我是孩子的无参构造器

3、如果我的父类没有提供无参构造方法,但是提供了 有参构造方法,结果会如何?

子类直接出现编译错误,错误提示是: 在父亲类那里没有找到默认的构造器。 说明:如果父类没有提供默认的构造方法,而只是提供了有参构造方法,子类在继承时候,就会出错。

错误的原因是:编译器看到我们在Father类里写了有参构造法方法,它就会认为,我们不想让子类在回溯的时候走 默认构造方法这条路【super(); 此路不通】,但是我们又没告诉给子类,它应该走哪条路,所以会报错。 所以,若父类没有提供无参构造方法,但是提供了 有参构造方法,就要在子类的无参构造方法里,显示的加上调用父类的有参构造方法语句。 如下:super(1);

控制台输出语句如下:

我是爷爷的无参构造器
我是父亲的有参构造器
我是孩子的无参构造器

证明,子类找到了回溯的路!

启示:在以后的Java开发中,若一个POJO类要有带参构造方法,要记得先写无参构造方法。

(0)

相关推荐

  • 好好理解 Python 面向对象中的多继承和super

    最近有些朋友咨询 VIP 相关的事,我说就是在介绍文里面写的那些,分阶段进行的,知识就是那么些知识,没什么牛逼,只是我稍微能够讲得更容易理解一些罢了. 然后就有人问了,有没有试看? 我说了句" ...

  • 为什么要有无参构造方法,无参构造的运行原理

    无参构造器也叫无参构造方法,在我们创建类时候,可以不用写构造方法,因为系统会默认给我们提供一个无参构造方法,如果我们自己写了无参构造方法,那么我们这个就将默认的覆盖了. (这时候你可能回想,既然会默认 ...

  • 为什么要有无参构造方法和无参构造的原理

    下午跟着码项目的时候发现每一个构造器都输入了shift+alt+s了一个无参构造 诸如此类 就自己做了个实验 共有 GrandPa.Father和Son 3个类, 我现在在 main方法里 执行这条语 ...

  • 通过this()调用有参构造方法

    使用原因:在通过无参构造方法实例化对象时,如果有属性可以设置默认值,可通过在无参构造方法中使用this()调用有参构造方法实现. this()需要写在无参构造方法的第一行! 例子:在没有给出小猫的名字 ...

  • 无参构造方法的作用

    无参构造方法的作用

  • Java子类实例化总是默认调用父类的无参构造方法

    2020-09-06 21:15:12 3点赞 Lucius_Keep_Going! 码龄3年 关注 继承关系的细节 子类拥有父类的属性和方法,但是对于父类的私有属性(private修饰),子类是无权 ...

  • Java无参构造方法的作用

    无参构造函数,主要用于在子类创建对象时使用,java程序在执行子类的构造方法之前,会去调用父类构造方法,可以显示的指定super()某一个父类构造函数,如未显示指定 super(), public c ...

  • Java中子类在实例化的时候调用父类的无参构造方法

    Java中子类在实例化的时候调用父类的无参构造方法

  • java有参构造方法和无参构造方法

    一.无参构造方法 1.定义: 如果编写一个javaBean时没有添加无参构造方法,那么编译器会自动添加无参构造方法: 但是如果编写时添加了有参构造方法而未添加无参构造方法,那么编译器只认有参构造方法而 ...

  • Java为什么要在类中声明一个无参构造方法

    在Java程序编写中,子类的构造方法必定会调用父类的构造方法,如果在子类的构造方法中没有指定调用父类的哪个构造方法,在实例化子类对象时,子类会默认调用父类的无参构造方法.如果在父类中没有定义无参构造方 ...