您现在的位置是:首页 > 正文

为什么要有无参构造方法,无参构造的运行原理 热门推荐

2024-02-01 02:23:03阅读 4

本文参考链接:https://blog.csdn.net/Akanarika520/article/details/84927403

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

(这时候你可能回想,既然会默认提供无参构造,我又为什么每次都要写无参构造呢?)

那么为什么一定要有这么一个无参构造方法呢?

1、因为我们在实例对象的时候,都要不断的向上(父类)回溯,回溯到Object(),要想顺利的回溯到Object,就必须给指定一条通路,如果没有,就用默认的 super()。
下面是我的一个测试,共有 GrandPa、Father和Son 3个类,在这里插入图片描述
我现在在 main方法里 执行这条语句。Son son = new Son(); 控制台的输出结果如下:
在这里插入图片描述
由结果可知,一定不断的回溯到了Object,只不过是没有打印语句而已。若我们不指定调用父类的哪个构造方法。就会调用默认的无参构造方法,当然这个调用语句是在方法体的第一行。

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

(这时你可能会想为什么有时一定要加super,下面接着看)

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

3、如果我的父类没有提供无参构造方法,但是提供了 有参构造方法,结果会如何?
在这里插入图片描述
子类直接出现编译错误,错误提示是: 在父亲类那里没有找到默认的构造器。 说明:如果父类没有提供默认的构造方法,而只是提供了有参构造方法,子类在继承时候,就会出错。

(解释什么时候一定要有super)
详细错误的原因解释是:编译器看到我们在Father类里写了有参构造法方法,它就会认为,我们不想让子类在回溯的时候走默认的无参构造方法这条路【super(); 此路不通】,但是我们又没告诉给子类,它应该走哪条路(你给了有参就是告诉我不要走无参,但也没告诉我走有参,那走哪?),所以会报错。 所以,若父类没有提供无参构造方法,但是提供了有参构造方法,就要在子类的无参构造方法里,显示的加上调用父类的有参构造方法语句。 如下:super(1);(这里就告诉了去走有参了)在这里插入图片描述
控制台输出语句如下:

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

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

启示总结:
1.无参构造运行是需要往上一级一级找无参,甚至找到object
2.如果其中一级只有有参,没有无参,会发生错误。但只有无参,没有有参一定不会出错。
3.在以后的Java开发中,若一个POJO类要有带参构造方法,要记得先写无参构造方法。防止类追溯时找不到上级,报错。

网站文章

  • 面试题:JS去除数组中重复的元素

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title></title> </head> <body> <script type="text/javascr

    2024-02-01 02:22:56
  • DMA原理,步骤超细详解,一文看懂DMA

    DMA原理,步骤超细详解,一文看懂DMA

    关注、星标公众号,直达精彩内容素材来源:csdn整理:技术让梦想更伟大|李肖遥 DMA的基本介绍 什么是DMA (DMA的基本定义)DMA,全称Direct Memory Access,即直接存储器访问。DMA传输将数据从一个地址空间复制到另一个地址空间,提供在外设和存储器之间或者存储器和存储器之间的高速数据传输。我们知道CPU有转移数据、计算、控制程序转移等很多功能,系统运作的核心就...

    2024-02-01 02:22:49
  • JS系列:分享 75 个精选的 JavaScript 基础知识点(上)

    JS系列:分享 75 个精选的 JavaScript 基础知识点(上)

    JS系列:分享 75 个精选的 JavaScript 基础知识点(上)

    2024-02-01 02:22:43
  • [LeetCode 874] Maximum Vacation Days

    LintCode wants to give one of its best employees the option to travel amongNcities to collect algori...

    2024-02-01 02:22:14
  • 整数因子分解问题

    Problem Description 大于1 的正整数n可以分解为:n=x1*x2*…*xm。 例如,当n=12 时,共有8 种不同的分式: 12=12; 12=6*2; 12=4*3; 12=3*4; 12=3*2*2; 12=2*6; 12=2*3*2; 12=2*2*3。 编程任务: 对于给定的正整数n,编程计算n共有多少种不同的分解式。 Input

    2024-02-01 02:22:08
  • 操作系统国产化现状

    操作系统国产化现状

    在开源操作系统生态不断成熟的背景下,中国的国产操作系统依托开源生态和政策东风正快速崛起,市场潜力巨大,未来发展前景值得期待。中国桌面操作系统当前呈现两大特征:一是Windows+Inte...

    2024-02-01 02:22:01
  • java两个list的数据快速对比 map的使用

    1.思路: 把2个list数据放到map里面,利用map的containsKey进行快速比对 2. //数据1 List list1 = new ArrayList(); //数据2 List list2 = new ArrayList(); Map m...

    2024-02-01 02:21:32
  • PAT乙级-B1032 挖掘机技术哪家强(20)

    为了用事实说明挖掘机技术到底哪家强,PAT 组织了一场挖掘机技能大赛。现请你根据比赛结果统计出技术最强的那个学校。

    2024-02-01 02:21:26
  • Android中的内存管理

    当进程内存不够的时候,安卓会再分配一些内存给各个进程。回收的时候就可能杀死那些正在占用内存的进程。所以操作系统需要有一个合理的杀死占用内存的进程的机制,以保证把副作用降到最低。安卓系统会为每个进程合理...

    2024-02-01 02:21:19
  • Linux驱动中断和定时器

    Linux驱动中断和定时器

    Linux驱动中断和定时器一文搞定中断顶半部,底半部机制,硬件中断,软中断,Tasklet,工作队列,jiffies,定时器

    2024-02-01 02:20:50