Java继承关系中构造器的使用详解

 更新时间:2025年10月22日 10:22:53   作者:Yvonnel1  
本文介绍了继承关系中构造器的使用要点,创建子类对象时,必须先调用父类构造器实现初始化,若父类无参构造器被覆盖,子类需用super显式调用父类构造器,且super须写在构造器首行,感兴趣的朋友跟随小编一起看看吧

       本文讲的是有继承关系的两个类之间,使用构造器的细节。在看之前,请确定你已经了解了“构造器”和“继承”基础的语法知识。

       如果你对构造器和继承比较了解,可以直接跳过前面的基本介绍,直接看后面的继承中构造器的使用即可。

       先简单介绍一下构造器基础:构造器是一个类在实例化(创建)一个对象的时候,给对象初始化的一个特殊方法。打个比方:

public class temp {
    public static void main(String[] args) {
//创建一个person对象,并初始化对象的name 和 age
        Person person = new Person("jack",18);
    }
}
class Person {
    String name;
    int age;
    //带有两个参数的构造器
    public Person(String name , int age){
        this.name = name;
        this.age =age;
    }
}

        这里就是运用两个参数的构造器初始化了一个对象,当然你可能会想,如果我写Person(String name , int age)构造器,那么在创建方法的时候是不是就不会使用构造器了?

     答案是:当然不会,如果我们不定义构造器,那么类里面默认有一个无参构造器,顾名思义就算没有参数的构造器,在创建对象的时候不对其进行初始化。但是这个构造器是存在的,只是没什么用。

     而且这个无参构造器在我们定义了一个有参数的构造器之后就被覆盖了(直接无了),此时如果我们再直接 进行无参创建,就会报错。

     如果我们还想使用无参构造器,那么就需要在类中显式声明一下即可

class Person {
    String name;
    int age;
    //显式声明无参构造器
    public Person(){
    }
    //带有两个参数的构造器
    public Person(String name , int age){
        this.name = name;
        this.age =age;
    }
}

     当然说这么多,你只需要知道一条:在创建对象的时候一定会调用一次构造器,不管是无参的还是有参的

      然后是关于继承的,这里也简单说一下:继承就是一个类(子类)通过 extend 来使其具备所继承类(父类)的属性与成员方法。

     打个比方,我有两个类:Person,Doctor。其中Person有属性name,age。Doctor里面也有name和age。我们就可以让Doctor继承Perosn来获得其属性。

     再或者Pupil(小学生)和Gratuation(大学生)有很多共同属性,我们可以创建一个父类Student让二者继承父类,来提高代码复用性。

//父类 Student
class Student {
    public String name;
    public int age;
    public double score;
   }
//子类 Pupil
class Pupil extends Student {
         //其拥有父类Student里面的所有属性
}
//子类Gratuate
class Gratuate extends Student{
         //其拥有父类Student里面的所有属性
}

   OK,现在进入正题,现在我们有一个子类Son,一个父类Base。Son继承了Base里面的属性和成员方法

//父类
class Base {
//显式声明一下无参构造器
    public Base() {
  System.out.println("父类Base中的构造器Base()被调用");
    }
}  
//子类
class Son extends Base {
    public Son() {
//显式声明一下无参构造器
System.out.println("子类Son的构造器Son()被调用");
  }
}
//主程序 
public class Run {
    public static void main(String[] args) {
        Son son = new Son();
    }
}Public 
   

   现在我们创建了一个Son类,这时候程序会有以下输出

我们就可以得到第一个特点:子类对象必须调用父类的构造器,完成初始化。

即在new Son()的时候,在Son的构造器初始化之前需要先调用父类的构造器。当父类中的无参构造器存在的时候,这个过程可以自动进行,不需要我们手动调用。

   那么如果父类的无参构造器被覆盖了,会发生什么?如果父类没有无参构造器,我们就会发现我们还按照上面的写代码,编译是不通过的。

class Son extends Base {
    public Son() {
   //编译不通过
        System.out.println("子类Son的构造器Son()被调用");
    }
}
class Base {
    public Base(int n1) {
    System.out.println("父类Base中的构造器Base(int n1)被调用");
    }
}

  因为此时系统不知道要调用父类中的那个构造器,所以此时需要我们手动填写调用父类中的那个构造器即:

      如果父类中的无参构造器被覆盖了,而我们也没有显式无参构造器。那么在子类调用构造器的时候,必须要使用 super() ;方法指明要使用父类中的那个构造器进行初始化。

class Son extends Base {
    public Son() {
        super(2);//使用 Base(int n)构造器,传入一个int
        System.out.println("子类Son的构造器Son()被调用");
    }
class Base {
    public Base(int n1) {
    System.out.println("父类Base中的构造器Base(int n1)被调用");
    }

需要特别注意的是:super方法只能放在构造器的第一行。

      总结一下就是:

1.子类对象必须调用父类的构造器,完成初始化。

2.如果父类中的无参构造器被覆盖了,而我们也没有显式无参构造器。那么在子类调用构造器的时候,必须要使用 super() ;方法指明要使用父类中的那个构造器进行初始化。

到此这篇关于Java继承关系中构造器的使用详解的文章就介绍到这了,更多相关java构造器使用内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java之map的常见用法讲解与五种循环遍历实例代码理解

    Java之map的常见用法讲解与五种循环遍历实例代码理解

    map是一组键值对的组合,通俗理解类似一种特殊的数组,a[key]=val,只不过数组元素的下标是任意一种类型,而且数组的元素的值也是任意一种类型。有点类似python中的字典。通过"键"来取值,类似生活中的字典,已知索引,来查看对应的信息
    2021-09-09
  • Java读写Cookie记录的方法

    Java读写Cookie记录的方法

    这篇文章主要介绍了Java读写Cookie记录的方法,实例分析了java针对cookie记录读取与写入的技巧,需要的朋友可以参考下
    2015-05-05
  • SpringBoot集成Kafka并使用多个死信队列详解

    SpringBoot集成Kafka并使用多个死信队列详解

    这篇文章主要为大家详细介绍了SpringBoot集成Kafka并使用多个死信队列的示例代码,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2025-05-05
  • 浅谈JVM垃圾回收有哪些常用算法

    浅谈JVM垃圾回收有哪些常用算法

    今天给大家带来的是关于Java虚拟机的相关知识,文章围绕着JVM垃圾回收有哪些常用算法展开,文中有非常详细的介绍及代码示例,需要的朋友可以参考下
    2021-06-06
  • java定时任务cron表达式每周执行一次的坑及解决

    java定时任务cron表达式每周执行一次的坑及解决

    这篇文章主要介绍了java定时任务cron表达式每周执行一次的坑及解决,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-06-06
  • cmd使用javac和java及注意事项

    cmd使用javac和java及注意事项

    这篇文章主要介绍了cmd使用javac和java及注意事项,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2021-12-12
  • SpringBoot无法连接redis的解决方案

    SpringBoot无法连接redis的解决方案

    这篇文章主要介绍了SpringBoot无法连接redis的解决方案,文中通过代码示例给大家讲解的非常详细,对大家的学习或工作有一定的帮助,需要的朋友可以参考下
    2024-08-08
  • Java 如何快速实现一个连接池

    Java 如何快速实现一个连接池

    有没有一个通用的库可以快速实现一个线程池呢?得益于 Java 完善的生态,前人们针对这种需要开发了一个通用库:Apache Commons Pool(下文简称 ACP)。本质上来说,ACP 库提供的是管理对象池的通用能力,当然也可以用来管理连接池了!
    2021-05-05
  • 浅谈Mybatis二级缓存的缺陷

    浅谈Mybatis二级缓存的缺陷

    本文主要介绍了浅谈Mybatis二级缓存的缺陷,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-08-08
  • Spring Data Elasticsearch 5.x实现单词纠错和自动补全

    Spring Data Elasticsearch 5.x实现单词纠错和自动补全

    这篇文章主要为大家介绍了Spring Data Elasticsearch 5.x实现单词纠错和自动补全示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-08-08

最新评论