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

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

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

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 邀请回答

7条回答 默认 最新

  • tongyi55555
    JonsonJiao 2015-07-13 12:59
    已采纳

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

    this("George", 10, school);
    
    点赞 评论
  • SunliyMonkey
    SunliyMonkey 2015-07-13 11:33

    你这样编译没有问题呀。

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

    我觉得你可以这样理解:

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

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

    点赞 评论
  • Evankaka
    Evankaka 2015-07-13 14:13

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

    点赞 评论
  • devmiao
    devmiao 2015-07-13 15:11

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

    点赞 评论
  • frank_20080215
    frank_20080215 2015-07-13 15:35

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

    点赞 评论
  • YYWW1110
    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
    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

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

    点赞 评论

相关推荐