JAVA继承中子父类的构造方法
Java  /  管理员 发布于 8年前   148
首先,构造方法本身会有一个隐式的无参构造(默认):
①不写构造方法,类中的第一行代码事实上有一个默认的无参构造(系统会隐式为你写好)
public class Student { private String name;// public Student() {} 隐式地“写”在这里,你看不见// Strudent类中虽然没有写构造方法,但相当于有上面的无参构造// 只不过是隐式的,你看不见}
(推荐视频:java视频教程)
②只写带参构造方法,相当于只有该带参构造方法(隐式的无参构造会被屏蔽无视掉,视为无效)
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教程栏目,欢迎学习!
以上就是JAVA继承中子父类的构造方法的详细内容,更多请关注其它相关文章!
122 在
学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..123 在
Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..原梓番博客 在
在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..博主 在
佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..1111 在
佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
Copyright·© 2019 侯体宗版权所有·
粤ICP备20027696号