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 “ ...
随机推荐
- Python eval() exec()
eval(str) 函数:将字符串 str 当成有效的表达式来求值并返回计算结果常见作用:1,计算字符串中有效的表达式,并返回结果In [55]: eval('pow(10,2)') # 函数Out[ ...
- go-linux环境搭建
下载 go1..linux-amd64.tar.gz 解压: tar zxvf go1..linux-amd64.tar.gz -C /usr/local 配置环境变量:vim /root/.bas ...
- javascript学习总结之对象的深拷贝和浅拷贝
前言 最近在写ES6的文章的时候发现重复遇到关于javascript深拷贝和浅拷贝的问题,然后查找了一些资料,根据资料和自己的理解做了以下笔记,毕竟javascript关于深拷贝和浅拷贝的问题在一些面 ...
- 【笔记】关于N-Way K-Shot 分类问题的理解
Time: 2019年10月27日 Author:Veagau 在看讲Repitle的论文[On First-Order Meta-Learning Algorithm]时,实验环节对N-Way K- ...
- Vue学习系列(三)——基本指令
前言 在上一篇中,我们已经对组件有了更加进一步的认识,从组件的创建构造器到组件的组成,进而到组件的使用,.从组件的基本使用.组件属性,以及自定义事件实现父子通讯和巧妙运用插槽slot分发内容,进一步的 ...
- Linux及Windows安装Redis(详细)
Linux及Windows安装Redis 1.Windows安装教程 1.1下载 https://github.com/MSOpenTech/redis/releases 进入github里下载red ...
- 百万年薪python之路 -- 带颜色的print
带颜色的print print输出带颜色的方法详解 书写格式: 开头部分:\033[显示方式;前景色;背景色m + 结尾部分:\033[0m 注意:开头部分的三个参数:显示方式,前景色,背景色是可 ...
- 小白学 Python(11):基础数据结构(元组)
人生苦短,我选Python 前文传送门 小白学 Python(1):开篇 小白学 Python(2):基础数据类型(上) 小白学 Python(3):基础数据类型(下) 小白学 Python(4):变 ...
- 获取gps信息
(一)plist修改 添加如下变量 (二)新建视图用来启动Gps 此视图控制器继承CLLocationManagerDelegate #import <UIKit/UIKit.h> #im ...
- Linux上安装mysql,实现主从复制
MYSQL(mariadb) MariaDB数据库管理系统是MySQL的一个分支,主要由开源社区在维护,采用GPL授权许可.开发这个分支的原因之一是:甲骨文公司收购了MySQL后,有将MySQL闭源的 ...