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

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

    

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. Spring Boot入门(一):搭建Spring Boot项目

    从本篇博客开始,我们开始进入Spring Boot的世界,它的出现使Spring的开发变得更加简洁,因此一经推出受到众多程序员的喜爱. 作为Spring Boot系列的第一篇博客,我们先来讲解下如何搭 ...

  2. 初识mpvue

    听说mpvue可以实现H5和小程序的同时开发  对使用过vue的选手几乎是0难度 忍不住搓搓小手手 看了文  唔~ 似乎不是很难的样子 然后实际上手操作了一下 老规矩:新建项目 npm install ...

  3. php好在哪?

    PHP即“超文本预处理器”,是一种通用开源脚本语言.PHP是在服务器端执行的脚本语言,与C语言类似,是常用的网站编程语言.PHP独特的语法混合了C.Java.Perl以及 PHP 自创的语法.利于学习 ...

  4. C#发送电子邮件(SMTP)及outlook.com账号之概要

    这是关于c#发送电子邮件(SMTP)的技术笔记,以”简报“形式呈现. 因为最后成功通过outlook.com发送了邮件,所以,我觉得还是有必要 记录一下其中的要点. 一.技术核心 .net Frame ...

  5. lable的渲染

    <StackPanel Margin=" TextOptions.TextFormattingMode="Display"> <Label TextOp ...

  6. redis集群之Codis

    在大数据高并发场景下,单个 Redis 实例往往会显得捉襟见肘.首先体现在内存上,单个 Redis 的内存不宜过大,内存太大会导致 rdb 文件过大,进一步导致主从同步时全量同步时间过长,在实例重启恢 ...

  7. (Java) Md5Utils

    package com.vcgeek.hephaestus.utils; import java.security.MessageDigest; public class Md5Utils { /** ...

  8. find 小案例

    说明:前几天对生产环境的一些重要数据进行备份时用到了find,查找特定符合条件的文件名后拷贝至指定目录,但是只拷贝了部分匹配到的文件 小案例模拟还原: [root@centos- ~]# ll /te ...

  9. CSPS_108

    二逼出题人写错T1题面&&写伪T3std祭

  10. CSPS 模拟 70

    考试结束看A了两题就有点遗憾开开心心地去颓废了 吐槽一下这局LRS开的有点睿智,SD当的有点累 T1跟前边一个T1挺像,打表也可以 T2智障dp,开滚动数组就不会被卡空间了 T3牛逼构造题,虽然不是很 ...