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

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

    

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继承中子父类的构造方法的更多相关文章

  1. java继承子父类构造函数-子类的实例化过程

    1 /* 2 * 子父类中的构造函数的特点. 3 * 在子类构造对象时,发现,访问子类构造函数时,父类也运行了. 4 * 为什么呢? 5 * 原因是:在子类的构造函数中第一行有一个默认的隐式语句.su ...

  2. java 继承条件下的构造方法调用

    运行 TestInherits.java示例,观察输出,注意总结父类与子类之间构造方法的调用关系修改Parent构造方法的代码,显式调用GrandParent的另一个构造函数,注意这句调用代码是否是第 ...

  3. 关于java继承条件下的构造方法调用

    首先是测试代码: class Grandparent { public Grandparent() { System.out.println("GrandParent Created.&qu ...

  4. Java继承--子父类中的构造函数

    子父类中的构造函数的特点: 1.在子类构造对象时,发现,访问子类构造函数时,父类构造函数也运行了.   原因是:在子类的构造函数中第一行有一个默认的隐式语句. super(); 类似于this(); ...

  5. Java继承中父类和子类构造函数的问题

    父类有无参构造函数时(显示或隐式),子类的有参和无参构造函数都是默认调用父类的无参构造函数:当父类只有有参构造函数时,子类可以有有参和无参构造函数,子类有参构造函数必须显式调用父类的有参构造函数,子类 ...

  6. JAVA中子类会不会继承父类的构造方法

    声明:刚刚接触java不久,如果理解有错误或偏差望各位大佬强势批判 java中子类能继承父类的构造方法吗? 父类代码: class Father { String name ; //就不set/get ...

  7. 关于JAVA中子类和父类的构造方法

    本篇文章总结了一些关于Java构造方法的常见问题. 为什么创建了一个子类对象会调用其父类的构造方法 如下代码示例: package simplejava; class Super { String s ...

  8. java继承关系中成员变量,构造方法,成员方法的关系

    Java继承中的成员关系 A:成员变量 a:子类的成员变量名称和父类中的成员变量名称不一样,这个太简单写那个名字就访问那个名字! b:子类的成员变量名称和父类中的成员变量名称一样,这个怎么访问呢? 子 ...

  9. java constructor 在构造子类时,一定会调用到父类的构造方法 “ 私有属性被继承了?”问题

    ” Error:Implicit super constructor Pet() is undefined. Must explicitly invoke another constructor “ ...

随机推荐

  1. .NET进阶篇04-Serialize序列化、加密解密

    知识需要不断积累.总结和沉淀,思考和写作是成长的催化剂这篇很轻松,没有什么费脑子的,所以解析较少,代码较多,为数不多的拿来即用篇整个章节分布请移步 内容目录 一.概述二.序列化1.二进制文件2.XML ...

  2. Could not initialize class com.fasterxml.jackson.databind.SerializationConfig

    问题 Spring web 与 Spring eureka集成后出现错误: Caused by: java.lang.NoClassDefFoundError: Could not initializ ...

  3. Helm神器,让管理Kubernetes像yum安装包一样简单

    目录 一.什么是Helm 二.安装 1.安装helm客户端 2.安装Tiller 3.创建服务端 4.给Tiller授权 5.为 Tiller 设置帐号 6.验证Tiller是否安装成功 三.Helm ...

  4. Spring Cloud Alibaba(三)Sentinel之熔断降级

    本项目演示如何使用 Sentinel 完成 Spring Cloud 应用的熔断降级调用. Sentinel 是阿里巴巴开源的分布式系统的流量防卫组件,Sentinel 把流量作为切入点,从流量控制, ...

  5. jQuery选择器 大于 空格 波浪线 加号

    JQuery选择器 大于 空格 波浪线 加号的区别 元素遍历 符号 说明 空格 $(‘parent child’)表示获取parent下的所有的child节点(所有的子孙). 大于号 $(‘paren ...

  6. 分享一次大厂的技术面试通过,却因学历被拒发 offer 的悲惨经历

    概述 今天心情很down,快周末了,说点不开心的事情给大家开心一下,上周面试心仪已久的大厂,技术面很顺利的通过一面/二面/三面,最后到HR面也很顺利,然后被问到学历(自考本科)后,HR 语气发生一些转 ...

  7. (JavaScript) 字符串转16进制

    function strToBase64() { var str = "https://www.baidu.com/"; var val = ""; for ( ...

  8. 宋宝华:关于Ftrace的一个完整案例

    本文系转载,著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处. 作者: 宋宝华 来源: 微信公众号linux阅码场(id: linuxdev) Ftrace简介 Ftrace是Lin ...

  9. Windows下内网渗透常用命令总结

    域内信息收集常用命令 net group /domain //获得所有域用户组列表 net group zzh /domain //显示域中zzh组的成员 net group zzh /del /do ...

  10. MySQL批量插入的分析以及注意事项

    目录 1.背景 2.两种方式对比 2.1.一次插入一条数据 2.2.一次插入多条数据 3.拓展一下 4.Other 1.背景 我们在工作中基本都会碰到批量插入数据到DB的情况,这个时候我们就需要根据不 ...