JAVA继承中子父类的构造方法
首先,构造方法本身会有一个隐式的无参构造(默认):
①不写构造方法,类中的第一行代码事实上有一个默认的无参构造(系统会隐式为你写好)
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()
一些关于子父类有参无参的组合情况(其实就是排列组合)练习,有兴趣的可以自己验证一下,如下(图片来源https://blog.csdn.net/asd991543753/article/details/89284108):

JAVA继承中子父类的构造方法的更多相关文章
- java继承子父类构造函数-子类的实例化过程
1 /* 2 * 子父类中的构造函数的特点. 3 * 在子类构造对象时,发现,访问子类构造函数时,父类也运行了. 4 * 为什么呢? 5 * 原因是:在子类的构造函数中第一行有一个默认的隐式语句.su ...
- java 继承条件下的构造方法调用
运行 TestInherits.java示例,观察输出,注意总结父类与子类之间构造方法的调用关系修改Parent构造方法的代码,显式调用GrandParent的另一个构造函数,注意这句调用代码是否是第 ...
- 关于java继承条件下的构造方法调用
首先是测试代码: class Grandparent { public Grandparent() { System.out.println("GrandParent Created.&qu ...
- Java继承--子父类中的构造函数
子父类中的构造函数的特点: 1.在子类构造对象时,发现,访问子类构造函数时,父类构造函数也运行了. 原因是:在子类的构造函数中第一行有一个默认的隐式语句. super(); 类似于this(); ...
- Java继承中父类和子类构造函数的问题
父类有无参构造函数时(显示或隐式),子类的有参和无参构造函数都是默认调用父类的无参构造函数:当父类只有有参构造函数时,子类可以有有参和无参构造函数,子类有参构造函数必须显式调用父类的有参构造函数,子类 ...
- JAVA中子类会不会继承父类的构造方法
声明:刚刚接触java不久,如果理解有错误或偏差望各位大佬强势批判 java中子类能继承父类的构造方法吗? 父类代码: class Father { String name ; //就不set/get ...
- 关于JAVA中子类和父类的构造方法
本篇文章总结了一些关于Java构造方法的常见问题. 为什么创建了一个子类对象会调用其父类的构造方法 如下代码示例: package simplejava; class Super { String s ...
- java继承关系中成员变量,构造方法,成员方法的关系
Java继承中的成员关系 A:成员变量 a:子类的成员变量名称和父类中的成员变量名称不一样,这个太简单写那个名字就访问那个名字! b:子类的成员变量名称和父类中的成员变量名称一样,这个怎么访问呢? 子 ...
- java constructor 在构造子类时,一定会调用到父类的构造方法 “ 私有属性被继承了?”问题
” Error:Implicit super constructor Pet() is undefined. Must explicitly invoke another constructor “ ...
随机推荐
- 前端深入之css篇丨初探【transform】,手把手带你实现1024程序员节动画
写在前面 马上就2020年了,不知道小伙伴们今年学习了css3动画了吗? 说起来css动画是一个很尬的事,一方面因为公司用css动画比较少,另一方面大部分开发者习惯了用JavaScript来做动画,所 ...
- Spring容器启动源码解析
1. 前言 最近搭建的工程都是基于SpringBoot,简化配置的感觉真爽.但有个以前的项目还是用SpringMvc写的,看到满满的配置xml文件,却有一种想去深入了解的冲动.折腾了好几天,决心去写这 ...
- JS-SDK
1. 签名 看到网上的大部分问题都集中在签名部分,请大家一定请熟读微信JS-SDK说明文档附录5-常见错误及解决方法 部分. 注意 在计算签名的过程中,如果url总是不对请 实验 首页的url或 ...
- justjavac(迷渡)知乎live--<<前端工程师的入门与进阶>>听讲总结
知乎听讲总结 知乎live----jjc<前端工程师的入门进阶> git地址 内容 前端的基础知识,计算机专业基础知识感觉还行.前端后台都有做过,现在觉得自己要深入.但是只看框架源码和自己 ...
- Mysql UTF-8mb4字符集的问题
官方Mysql手册链接 https://dev.mysql.com/doc/connectors/en/connector-j-reference-charsets.html Notes For Co ...
- OptimalSolution(6)--栈和队列
一.设计一个有getMin功能的栈 题目:实现一个特殊的栈,在实现栈的基本功能的基础上,再实现返回栈中最小元素的操作.pop.push.getMin操作的时间复杂度都是O(1). 思路:设计两个栈,一 ...
- js自增图片切换
使用js自增进行图片的切换 <!DOCTYPE html> <html lang="zh"> <head> <meta charset=& ...
- Nginx、WSGI、 uWSGI、 uwsgi的区别
当我们部署完一个应用程序,浏览网页时具体的过程是怎样的呢?首先我们得有一个 Web 服务器来处理 HTTP 协议的内容,Web 服务器获得客户端的请求,交给应用程序,应用程序处理完,返回给 Web 服 ...
- 加上cdn后字体跨域
@font-face是CSS3中的一个特性,可以把自己定义的Web字体嵌入到网页中,随着@font-face,越来越多的网页采用字体图标作为网页中的小图形. 比如Bootstrap就采用了Glyphi ...
- Android原生PDF功能实现:PDF阅读、PDF页面跳转、PDF手势伸缩、PDF目录树、PDF预览缩略图
1.背景 近期,公司希望实现安卓原生端的PDF功能,要求:高效.实用. 经过两天的调研.编码,实现了一个简单Demo,如上图所示. 关于安卓原生端的PDF功能实现,技术点还是很多的,为了咱们安卓开发的 ...