肥川川川
2019-07-30 21:44
采纳率: 66.7%
浏览 970
已采纳

请问父类中存在有参构造方法时,一定要存在一个同名的无参构造方法吗?

图片说明

图1为父类的无参构造方法和有参构造方法,若是将无参构造方法删除,则子类的有参构造方法会报错。

如图2

图片说明

百度后听说父类可以不存在无参构造方法,但是子类中要使用super(属性名)的形式,我尝试后仍然报错

图片说明

(有想过是不是因为这些属性都被private修饰过才不行,但是将private删去仍然不行)

所以是不是说明,父类中必须存在一个无参的构造方法,因为我们定义了一个有参的构造方法,系统不会再自动帮我们生成无参构造方法,所以要我们自己写出来?

还有就是子类中的这个有参构造方法算不算是对父类构造方法的重写?(似乎不是,重写的话我记得方法名也是要一样的,那么这个构造方法和父类之间的关系是什么呢?)

大佬们能指点一二吗?qwq

  • 写回答
  • 好问题 提建议
  • 关注问题
  • 收藏
  • 邀请回答

7条回答 默认 最新

  • 1-只小猴子 2019-07-31 09:32
    已采纳

    1.在你的代码中,pikacar继承了cars (Java类名首字母记着要大写Pikacar/Cars,并且请遵守大驼峰形式PikaCar),父类cars重载(不是重写,谨记)了构造方法。
    如果重载构造方法后没有手动将无参构造方法写出,此时在你的子类pikacar中,构造方法中调用super相关方法,此时super就代表了你父类的无参构造,而你的父类cars已经重载了构造方法并且未手动写出无参构造,因此编译器找不到你的无参构造方法,就会报错。
    2.关于父类构造和子类的构造的关系,无关联,如果非要说关联的话就是当你创建子类对象时会首先调用父类的无参构造

    已采纳该答案
    评论
    解决 2 无用
    打赏 举报
  • yyjjttww 2019-07-31 11:20
    1. 首先你要了解一点,在未添加有参构造方法的情况下,编译器会自动帮你添加无参构造方法,当然你也可以自己写一个无参构造方法。
    2. 子类构造的时候需要用到父类的构造方法,默认是调用父类的无参构造方法,如果父类没有定义无参构造方法且定义了有参构造方法时,则需要手动调用父类的有参构造方法。
    3. 因此,正常使用存在四种情况 (1)父类和子类都没有定义有参构造方法,子类默认调用父类无参构造方法,无需额外编写。 (2)父类和子类都有参构造方法,子类调用父类有参构造方法,需手动编写。 (3)父类定义了有参构造方法、子类没有定义有参构造方法,子类调用父类构造方法,需手动编写。 (4)父类没有定义有参构造方法、子类定义了有参构造方法,子类调用父类构造方法,需手动编写,即在子类构造方法内调用super()。
    评论
    解决 2 无用
    打赏 举报
  • weixin_44007558 2019-07-30 23:36

    因为子类继承了父类,要实例化子类,必须先实例化父类。一般情况下,编译器会自动添加super.父类无参构造方法();当你父类定义了有参构造函数,编译器就不会自动帮你添加无参构造函数,所以在继承中,子类初始化就无法调用super.父类无参构造方法(); 重写的话,必须方法名和参数类型、数量都保持一致。谢谢

    评论
    解决 无用
    打赏 举报
  • 毕小宝 2019-07-31 10:01

    无参数构造函数是不一定的,如果定义了一个有参数构造函数,那么只能通过这个有参构造函数创建对象了。

    评论
    解决 无用
    打赏 举报
  • zhshchilss 2019-07-31 10:16

    1.子类构造一定要调用父类的构造方法,如果不写,默然是调用super()
    2.如果父类没有无参构造,这就报错了,需要你指定调用父类的哪个构造方法。譬如父类里有一个 super(name:String)
    3.如果父类同时存在无参构造,和有参构造。
    你不写,则还是默认调用super()无参构造。
    你也可以显式的调用父类有参构造,不用默认的无参构造.super(name)
    4.super方法要放在构造的第一行
    5.一般都有super()。如果没有无参构造,只有有参构造,说明有参构造的参数是这个对象必须的。初始化对象的时候就要赋值

    评论
    解决 无用
    打赏 举报
  • privateStringInt 2019-11-05 09:20

    private int;
    private String name;
    private String age;
    private String sex;

    
    
    评论
    解决 无用
    打赏 举报
  • 1+1是几呀? 2019-11-19 21:56

    当子类和父类都存在有参构造方法,如果调用父类的构造方法时,既不用this 也不用super,则编译器自动加上super(),即调用父类不带参数的构造函数。如果直接父类没有一个不带参数的方法,则编译不能通过,想解决这一问题可以在子类的构造方法中加入调用父类已有的构造方法,或者在父类加一个不带参数的构造方法,还可以去掉父类中全部的构造方法,编译器会自动加入一个不带参数的构造方法,就那个默认构造方法。
    class A
    {
    A(int a){}
    }

    class B extends A
    {
    B(String s){} //编译不通过
    }

    评论
    解决 无用
    打赏 举报

相关推荐 更多相似问题