CourageGeorge 2015-07-13 11:21 采纳率: 100%
浏览 8298
已采纳

java子类构造方法的问题--必须要先调用父类的构造方法么?

好像有这样一说法在子类的构造方法中,如果没有调用父类的构造方法,就会默认加一个super()
如果父类没有这一构造方法,就会报错。我想问java在子类的构造方法时候是先检验是否能生成父类的对象还是先检测是否调用了该子类的其他构造方法,因为我这样试了试通过了编译。图片说明

  • 写回答

7条回答 默认 最新

  • JonsonJiao 2015-07-13 12:59
    关注

    我的理解是18-19之间是没有调用的,因为下面的这句话就说明了19行的内容其实是等价于直接执行三个参数的构造方法,真正需要执行super的是在这三个参数的构造方法中。

    this("George", 10, school);
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
  • SunliyMonkey 2015-07-13 11:33
    关注

    你这样编译没有问题呀。

    默认情况下,如果类中没有构造函数,其自带一个没有参数的构造函数。(首先super(),一般情况下都没有错)

    我觉得你可以这样理解:

    继承父类, 就获得其成员变量,成员函数的使用。
    因此需要对这些成员变量做一些初始化工作。
    这个从逻辑上是应该如此的。
    父类初始化完成后,再接着初始化本身的成员变量。

    而编译器,为了防止你遗忘这个逻辑顺序。也许就添加了一个检查规则: 查看子类的构造函数中是否有父类的构造函数

    评论
  • Evankaka 博客专家认证 2015-07-13 14:13
    关注

    你上面的程序是没问题,但是这里要注意。默认的无参构造函数没有生成了。如果生成
    Student student=new Student();会报错。所有重载了有参的构造函数,一般最好也把无参的自己写上。当然,里面第一句就是super()

    评论
  • devmiao 2015-07-13 15:11
    关注

    是的,但是默认会调用无参数的构造函数。如果你没有定义无参数的构造函数但是定义了别的构造函数,就需要自己去调用super了。

    评论
  • frank_20080215 2015-07-13 15:35
    关注

    子类的构造方法中,如果没有调用父类的构造方法,就会默认加一个super()。
    那么调用父类的构造方法就是默认构造函数

    评论
  • yan--129 2017-06-13 14:18
    关注

    class Student extends Person {
    private String school;
    Student (String name,String school){

        //this(name,school,"beijing");
            super();
    }
    Student(String n,String l,String school){
        super(n,l);
        this.school = school;
    }
    public String info(){
        return super.info()+"school:"+school;
    }
    

    }
    同样的问题 ,不解

    评论
  • MichaelJLU 2018-03-20 07:33
    关注

    这个编过没问题,java要求在构造函数中,只要有父类构造函数调用就可以。
    Student(String school)构造函数中,首先调用的就是另一个构造函数Student (String name, int age, String school),在这个构造函数中,又调用了super(name,age),所以相当于调用了父类构造函数。
    如果去掉super(name,age), 再编译就会报错了。
    Test.java:21: error: constructor Person in class Person cannot be applied to given types;
    Student (String name, int age, String school){
    ^
    required: String,int
    found: no arguments
    reason: actual and formal argument lists differ in length
    1 error

    所以如果重载了父类的构造函数,也最好留一个参数为空的默认构造函数。

    评论
查看更多回答(6条)

报告相同问题?

悬赏问题

  • ¥15 电脑锁屏时vba运行SAP,excel数据不能复制到SAP
  • ¥50 74LS系列 74LS00 74LS04设计一个RS485电路(关键词-差分)
  • ¥30 各位help写一下代码
  • ¥15 在运行SDEdit模型下载不了
  • ¥15 求51控制l298n驱动的小车中超声波避障怎么写
  • ¥15 电脑连上WIFI却用不了
  • ¥30 MATLAB在RLC电路的固有响应和阶跃响应GUI仿真报告
  • ¥15 hyper-v出现的问题
  • ¥15 有能用的可加酬金,求可以批量下载懒人听书的软件,能登录自己帐号的。
  • ¥100 高博一起做RGB-D SLAM(5)VO无法出visualisation问题