关于Java继承中父类和子类构造函数的问题

 更新时间:2020年10月20日 10:31:03   作者:zx33699659  
这篇文章主要介绍了关于Java继承中父类和子类构造函数的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

Java子类在实例化时默认调用的是父类的无参构造函数,不论实例化时调用的是子类的有参还是无参构造函数,

可以参考这篇Java子类实例化总是默认调用父类的无参构造操作

1、当父类没有显式定义构造方法时,

编辑器会默认为此类添加一个隐式无参构造函数。此时子类可以有自己的无参和有参构造方法。不论实例化时调用的是子类的有参还是无参构造函数,默认调用的是父类的无参构造函数。

2、当父类有显式定义无参构造方法时,

此时子类也可以有自己的无参和有参构造方法。类似于1,同样默认隐式调用父类的无参构造方法。

3、当父类只有显式定义有参构造方法时,

(1)子类定义无参方法会出错:Implicit super constructor Father() is undefined. Must explicitly invoke another constructor,即隐式父类构造函数Father()未定义, 必须显式调用另一个构造函数,当此时调用父类的有参构造函数时,使用super(i),这里i是参数,会提示i没有定义,因为此时是无参构造函数,此时要使子类也有无参构造函数,只能在子类的无参构造函数中调用父类的有参构造函数,并给父类的有参构造函数赋一个实参;

(2)在子类的有参构造函数中使用super(i)调用父类的有参构造函数不会出错,因此若父类只有有参的构造方法,子类也只能有有参的构造方法,且子类的有参构造方法必须显示调用父类的有参构造方法。

分析:默认都是调用父类的无参构造函数,当父类有有参构造函数时,编辑器不会为父类添加无参的构造函数,在子类继承父类时,本来是默认在构造函数第一行都是默认有使用super()调用父类无参构造函数的,现在父类没有无参构造函数,因此提示显示调用另一个构造函数(即有参构造函数)。

提醒一点,当没有子类继承父类时,父类只定义有参构造函数是没有问题的。

4、当父类和子类都有无参和有参构造方法时,默认是子类构造方法都是调用父类的无参构造方法的,但当子类的有参构造方法使用super(i)调用父类的有参构造方法时,带参数实例化时就不再调用父类的无参构造方法,而是调用父类的有参构造方法,因为是显示调用(人为强制的)。

总结:

父类有无参构造函数时(显示或隐式),子类的有参和无参构造函数都是默认调用父类的无参构造函数;当父类只有有参构造函数时,子类可以有有参和无参构造函数,子类有参构造函数必须显式调用父类的有参构造函数,子类无参构造函数也必须显式调用父类的有参构造函数,但需给父类有参构造函数赋实参。

1中的示例:

package classTest;
class Father1{

}
class Son1 extends Father1{
 public Son1() {
 System.out.println("子类的无参构造方法");
 }
 public Son1(int i) {

 System.out.println("子类中有参构造方法"+i);
 }
}
public class TestExtend {
public static void main(String[] args) {
 Son1 s = new Son1();
}
}

运行结果:

子类的无参构造方法

2中的示例:

package classTest;


class Father1{
 public Father1() { 
 }
}
class Son1 extends Father1{
 public Son1() {
 System.out.println("子类的无参构造方法");
 }
 public Son1(int i) {
 System.out.println("子类中有参构造方法"+i);
 }
}
public class TestExtend {
public static void main(String[] args) {
 Son1 s = new Son1();
}
}

运行结果:

子类的无参构造方法

3中的示例(1):

package classTest;
class Father1{

 public Father1(int i) {
 System.out.println("父类中的有参构造方法"+i);
 }
}
class Son1 extends Father1{

 public Son1() {
  //下两行需注释掉一行
 super(i);//此时会报错
 super(1);//此时不会报错,调用父类构造函数,但参数值是固定的,不能在调用时传入其他值。
 System.out.println("子类的无参构造方法");
 }
 public Son1(int i) {
   super(i);
 System.out.println("子类中有参构造方法"+i);
 }
}
public class TestExtend {
public static void main(String[] args) {
 Son1 s = new Son1();
}
}

结果:显示参数没有定义

Exception in thread "main" java.lang.Error: Unresolved compilation problem: i cannot be resolved to a variable

3中的示例(2):

package classTest;
class Father1{
 public Father1(int i) {
 System.out.println("父类中的有参构造方法"+i);
 }
}
class Son1 extends Father1{
 public Son1(int i) {
   super(i);
 System.out.println("子类中有参构造方法"+i);
 }
}
public class TestExtend {
public static void main(String[] args) {
 System.out.println("-----");
 Son1 a = new Son1(5);
}
}

结果:

-----

父类中的有参构造方法5

子类中有参构造方法5

4中的示例:

package classTest;
class Father1{
 public Father1() {
 System.out.println("父类的无参构造方法");
}
 public Father1(int i) {
 System.out.println("父类中的有参构造方法"+i);
 }
}
class Son1 extends Father1{

 public Son1() {
 System.out.println("子类的无参构造方法");
 }
 public Son1(int i) {
   super(i);
 System.out.println("子类中有参构造方法"+i);
 }
}
public class TestExtend {
public static void main(String[] args) {
 Son1 s = new Son1();
 System.out.println("-----");
 Son1 a = new Son1(5);
}
}

结果:

父类的无参构造方法

子类的无参构造方法

-----

父类中的有参构造方法5

子类中有参构造方法5

以上这篇关于Java继承中父类和子类构造函数的问题就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Java设计者模式简单工厂模式解析

    Java设计者模式简单工厂模式解析

    这篇文章主要介绍了Java设计者模式简单工厂模式解析,介绍了其简介,实例以及优缺点分析,具有一定参考价值,需要的朋友可以了解下。
    2017-11-11
  • 教你代码中获取当前 JAR 包的存放位置

    教你代码中获取当前 JAR 包的存放位置

    这篇文章主要介绍了如何获取当前JAR包的存放位置,要获取当前运行的 JAR 包所存放的位置,可以使用 ProtectionDomain 和 CodeSource 类,本文结合实例代码给大家介绍的非常详细,需要的朋友可以参考下
    2023-08-08
  • Spring JPA find分页示例详解

    Spring JPA find分页示例详解

    这篇文章主要为大家介绍了Spring JPA find分页示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-04-04
  • Java Swing树状组件JTree用法实例详解

    Java Swing树状组件JTree用法实例详解

    这篇文章主要介绍了Java Swing树状组件JTree用法,结合具体实例形式分析了Swing组件JTree构成树状列表的节点设置与事件响应,以及自定义图形节点的相关操作技巧,需要的朋友可以参考下
    2017-11-11
  • Java爬虫 信息抓取的实现

    Java爬虫 信息抓取的实现

    本文主要介绍 Java爬虫 信息抓取的实现,这里详细介绍了如何实现该方法,并附示例代码供大家学习参考,有兴趣的小伙伴可以参考下
    2016-09-09
  • Java基础之StringBuffer详解

    Java基础之StringBuffer详解

    这篇文章主要介绍了Java基础之StringBuffer详解,文中有非常详细的代码示例,对正在学习java基础的小伙伴们有非常好的帮助,需要的朋友可以参考下
    2021-04-04
  • springBoot service层事务控制的操作

    springBoot service层事务控制的操作

    这篇文章主要介绍了springBoot service层事务控制的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-02-02
  • 实例代码讲解JAVA 观察者模式

    实例代码讲解JAVA 观察者模式

    这篇文章主要介绍了JAVA 观察者模式的的相关资料,文中代码非常详细,帮助大家更好的理解和学习,感兴趣的朋友可以了解下
    2020-06-06
  • 解决若依pageHelper在动态切换数据源问题

    解决若依pageHelper在动态切换数据源问题

    这篇文章主要介绍了解决pageHelper在动态切换数据源问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-01-01
  • Java中字符串去重的特性介绍

    Java中字符串去重的特性介绍

    这篇文章主要介绍了Java中字符串去重的特性,是Java8中引入的一个新特性,至于是否真的用起来顺手就见仁见智了...需要的朋友可以参考下
    2015-07-07

最新评论