温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

如何使用java子父类的构造方法

发布时间:2020-06-21 22:52:39 来源:亿速云 阅读:154 作者:鸽子 栏目:编程语言

首先,构造方法本身会有一个隐式的无参构造(默认):

①不写构造方法,类中的第一行代码事实上有一个默认的无参构造(系统会隐式为你写好)

public class Student {
        private String name;
//        public Student() {}      隐式地“写”在这里,你看不见
//  Strudent类中虽然没有写构造方法,但相当于有上面的无参构造
//   只不过是隐式的,你看不见
}

②只写带参构造方法,相当于只有该带参构造方法(隐式的无参构造会被屏蔽无视掉,视为无效)

public class Student {
        private String name;
        public Student(String name) {
            this.name=name;
        }
//  此时原来Strudent类中的隐式的无参构造方法被屏蔽了,无效了
//  类中只有带参构造
}

③若想同时拥有无参和带参构造,必须显式地写出无参和带参构造方法

public class Student {
        private String name;
        public Student() {}
// 显式地将无参构造写出来        
        public Student(String name) {
            this.name=name;
        }
//  若想Strudent类中拥有无参构造方法,必须显式地写出来
}

进一步结合继承,就需要考虑到子父类:

④在子类的构造方法(无论是无参和有参)中,方法中的第一行代码事实上都隐式地包含了父类的无参构造方法

即: super()

public class Stu extends Student {
    private String name;
    public Stu() {
    // super();
    // 在子类的无参构造中,super()是隐式的“写”在这里的
    }
    
    public Stu(String name) {
    // super();
    this.name=name;
    // 在子类的带参构造,上面的super()同样也是隐式的“写”在这里的
    }
}

这就是为什么,调用子类的构造方法时,都会先调用父类的无参构造方法了,因为默认的super()存在。

⑤同理,类似与上面的②,此时若写一个有参构造,super(xx)会把隐式的super()屏蔽掉

public class Stu extends Student {
    private String name;
    
    public Stu(String name) {
    // super();  原来隐式写在这里的super()被屏蔽了,无效了
    super(name);
    
    // 在子类的带参构造, 由于的super(name)的存在,super()无效了
    //此时子类的带参构造中,只有super(name)
    }
}

这就是为什么当父类没有无参构造(即只有带参构造——对应情况②)时,子类的构造方法编译无法通过。这是因为子类的构造函数(带参或无参)将调用父类的无参构造函数。 由于编译器试图向子类中的2个构造函数中插入super() ,但父类的默认构造函数未定义,因此编译器会报告错误消息。

要解决这个问题,只需要

1)添加一个无参构造函数给父类——显式地在父类中添加无参构造

2)删除父类中自定义的有参构造函数——等价于恢复了默认的无参构造

3)将 Super(XXX) 添加到子类构造函数——通过⑤的原来来屏蔽默认的super()

以上就是JAVA继承中子父类的构造方法的详细内容,更多请关注亿速云其它相关文章!

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI