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构造器使用内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Maven的生命周期与自定义插件实现方法

    Maven的生命周期与自定义插件实现方法

    Maven的生命周期就是对所有的构建过程进行抽象和统一。包含了项目的清理、初始化、编译、测试、打包、集成测试、验证、部署和站点生成等几乎所有的构建步骤
    2022-12-12
  • Java基于iText7实现PDF添加通用文本水印的示例详解

    Java基于iText7实现PDF添加通用文本水印的示例详解

    这篇文章主要为大家详细介绍了Java基于iText7实现PDF添加通用文本水印的相关方法,文中的示例代码讲解详细,感兴趣的小伙伴可以了解下
    2026-02-02
  • 详解Mybatis的缓存

    详解Mybatis的缓存

    这篇文章主要介绍了Mybatis缓存的相关资料,帮助大家更好的理解和使用Mybatis框架,感兴趣的朋友可以了解下
    2021-01-01
  • java用split分割字符串的一个有趣现象

    java用split分割字符串的一个有趣现象

    最近在项目中使用了java中的split分割字符串,发现了一个bug,充分了展示了自己对java底层的认知有很多的不足和欠缺。下面将这次的经过总结出来分享给大家,有需要的朋友们可以参考借鉴,下面来一起看看吧。
    2016-12-12
  • SpringBoot中使用websocket出现404的解决方法

    SpringBoot中使用websocket出现404的解决方法

    在Springboot中使用websocket时,本地开发环境可以正常运行,但部署到服务器环境出现404问题,所以本文小编讲给大家详细介绍一下SpringBoot中使用websocket出现404的解决方法,需要的朋友可以参考下
    2023-09-09
  • Spring的编程式事务和声明式事务详解

    Spring的编程式事务和声明式事务详解

    这篇文章主要介绍了Spring的编程式事务和声明式事务的相关内容,涉及Spring事务属性、Spring事务的基本类等知识,需要的朋友可以了解下。
    2017-09-09
  • Java中RocketMq的消费方式详解

    Java中RocketMq的消费方式详解

    这篇文章主要介绍了Java中RocketMq的消费方式详解,RocketMQ的消费方式都是基于拉模式拉取消息的,而在这其中有一种长轮询机制(对普通轮询的一种优化),来平衡上面Push/Pull模型的各自缺点,需要的朋友可以参考下
    2023-10-10
  • SpringBoot整合RabbitMQ实现交换机与队列的绑定

    SpringBoot整合RabbitMQ实现交换机与队列的绑定

    这篇文章将通过几个实例为大家介绍一些SpringBoot中RabbitMQ如何绑定交换机(交换器)与队列,文中的示例代码讲解详细,感兴趣的可以了解一下
    2022-05-05
  • Java源码解析HashMap成员变量

    Java源码解析HashMap成员变量

    今天小编就为大家分享一篇关于Java源码解析HashMap成员变量,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-01-01
  • struts2通过action返回json对象

    struts2通过action返回json对象

    struts2通过action返回json对象其实很简单的,首先我们需要引入jar包,然后在写一个简单的action就好了,接下来通过本文给大家介绍struts2通过action返回json对象的方法,感兴趣的朋友一起看看吧
    2016-09-09

最新评论