zoukankan      html  css  js  c++  java
  • 为什么要有无参构造方法

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

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

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

    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类要有带参构造方法,要记得先写无参构造方法。防止类追溯时找不到上级,报错。

    tips:简单说就是当类中写了有参构造器的时候,默认的无参构造器就会失效,解决的方法一种是在子类中显式调用,另一种就是手写无参构造器。一般的话应该手写无参构造器,因为显式调用有时候就忘记了,会导致报错。

    启示2应该是:如果其中一级只有有参,没有无参,在没有指定继承有参构造时会出错。super可以理解为代词指代父类类名,当父类有参构造覆盖了无参构造,子类super.父类名相当于调用父类并不存在的无参构造,所以会报错

    当类中写了有残构造器的时候,默认的无参构造器就是失效。子类在调用的时候如果调用了父类的无参就会报错,即如果子类中有super();。而默认的无参构造器里边有默认创建的super();所以就会报错。所以尽量在子类中写上无参构造器

  • 相关阅读:
    Educational Codeforces Round 28 B. Math Show
    Educational Codeforces Round 28 A. Curriculum Vitae
    Codeforces Round #433 (Div. 2, based on Olympiad of Metropolises) D. Jury Meeting
    Codeforces Round #433 (Div. 2, based on Olympiad of Metropolises) C. Planning
    2017 Multi-University Training Contest 2 hdu 6047
    2017 Multi-University Training Contest 2 hdu 6045
    2017 Multi-University Training Contest 1 hdu 6043
    2017 Multi-University Training Contest 1 hdu 6034
    2017 Multi-University Training Contest 1 hdu 6033
    poj 2104主席树求区间第k小
  • 原文地址:https://www.cnblogs.com/vincentmax/p/14285798.html
Copyright © 2011-2022 走看看