java继承父类的构造方法_JAVA继承中子父类的构造方法

本文详细解析了JAVA中关于继承时子父类构造方法的使用规则。包括:1)类的默认无参构造;2)带参构造会屏蔽无参构造;3)子类构造方法隐式调用父类无参构造;4)当父类只有带参构造时,子类构造编译失败。为了解决这个问题,可以为父类添加无参构造,或者在子类构造中明确调用父类的带参构造。更多JAVA教程尽在php中文网。
摘要由CSDN通过智能技术生成

431607fd366059e2ad8bf6e59a7e59e2.png

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

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

本文来自php中文网,java教程栏目,欢迎学习!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值