当前位置: 首页 > news >正文

Java基础-25-继承-方法重写-子类构造器的特点-构造器this的调用

在面向对象编程中,继承是实现代码复用和扩展的重要机制。通过继承,子类可以继承父类的属性和方法,并且可以通过方法重写来改变或扩展父类的行为。此外,构造器在对象初始化过程中扮演了重要角色,尤其是在子类构造器中如何调用父类构造器和使用this关键字。

本文将重点讲解以下内容:

  1. 子类构造器的特点
  2. 构造器中this的调用
  3. 通过示例代码加深理解

一、子类构造器的特点

1. 子类构造器的基本概念

构造器是一个特殊的方法,用于初始化对象。当创建一个子类对象时,Java会自动先调用父类的构造器来初始化继承自父类的部分,然后再执行子类自己的构造器。

2. 父类构造器的调用规则

  • 如果子类构造器没有显式调用父类构造器(通过super()),Java会默认调用父类的无参构造器。
  • 如果父类没有无参构造器,子类必须显式调用父类的某个构造器(带参或无参),否则编译会报错。

3. 子类构造器的执行顺序

  1. 调用父类构造器(如果有显式调用super(),则按指定方式调用;否则默认调用父类无参构造器)。
  2. 执行子类自己的构造器逻辑。

二、构造器中this的调用

1. this的作用

在构造器中,this关键字可以用于引用当前对象的成员变量和方法。除此之外,this()还可以用于调用当前类中的其他构造器,从而减少重复代码。

2. 使用this()调用其他构造器的规则

  • this()必须放在构造器的第一行。
  • 一个构造器中只能调用一次this()
  • 通过this()调用其他构造器有助于简化代码,避免重复初始化逻辑。

三、示例代码

以下通过具体的代码示例,展示子类构造器的特点以及this的使用。

示例1:子类构造器调用父类构造器

 

java

深色版本

// 父类
class Parent {
    Parent() {
        System.out.println("Parent class constructor called");
    }

    Parent(String name) {
        System.out.println("Parent class constructor with name: " + name);
    }
}

// 子类
class Child extends Parent {
    Child() {
        super(); // 显式调用父类无参构造器
        System.out.println("Child class constructor called");
    }

    Child(String name) {
        super(name); // 显式调用父类带参数的构造器
        System.out.println("Child class constructor with name: " + name);
    }
}

// 测试类
public class Main {
    public static void main(String[] args) {
        // 创建无参子类对象
        Child child1 = new Child();
        /*
         输出:
         Parent class constructor called
         Child class constructor called
        */

        // 创建带参数的子类对象
        Child child2 = new Child("Alice");
        /*
         输出:
         Parent class constructor with name: Alice
         Child class constructor with name: Alice
        */
    }
}

示例2:构造器中使用this调用其他构造器

 

java

深色版本

// 类定义
class Animal {
    String name;

    // 无参构造器
    Animal() {
        this("Unknown"); // 调用带参数的构造器
        System.out.println("Animal constructor called");
    }

    // 带参数的构造器
    Animal(String name) {
        this.name = name;
        System.out.println("Animal constructor with name: " + name);
    }
}

// 测试类
public class Main {
    public static void main(String[] args) {
        // 创建无参对象
        Animal animal1 = new Animal();
        /*
         输出:
         Animal constructor with name: Unknown
         Animal constructor called
        */

        // 创建带参数对象
        Animal animal2 = new Animal("Lion");
        /*
         输出:
         Animal constructor with name: Lion
        */
    }
}

示例3:综合案例——子类构造器调用父类构造器与this结合

 

java

深色版本

// 父类
class Vehicle {
    Vehicle() {
        System.out.println("Vehicle constructor called");
    }

    Vehicle(String type) {
        System.out.println("Vehicle constructor with type: " + type);
    }
}

// 子类
class Car extends Vehicle {
    String model;

    // 无参构造器
    Car() {
        this("Unknown Model"); // 调用当前类的带参数构造器
        System.out.println("Car constructor called");
    }

    // 带参数构造器
    Car(String model) {
        super("Car"); // 调用父类带参数的构造器
        this.model = model;
        System.out.println("Car constructor with model: " + model);
    }
}

// 测试类
public class Main {
    public static void main(String[] args) {
        // 创建无参对象
        Car car1 = new Car();
        /*
         输出:
         Vehicle constructor with type: Car
         Car constructor with model: Unknown Model
         Car constructor called
        */

        // 创建带参数对象
        Car car2 = new Car("Tesla Model S");
        /*
         输出:
         Vehicle constructor with type: Car
         Car constructor with model: Tesla Model S
        */
    }
}

四、总结

  1. 子类构造器的特点

    • 子类构造器会先调用父类构造器(默认调用无参构造器,除非显式指定)。
    • 父类构造器的调用顺序优先于子类构造器。
  2. 构造器中this的调用

    • this()用于调用当前类的其他构造器,减少代码重复。
    • this()必须放在构造器的第一行。
  3. 实际应用

    • 在设计类时,合理使用super()this()可以让代码更加简洁和易维护。
    • 方法重写与构造器的结合使得子类能够灵活扩展父类的功能。

希望这些内容能帮助你更好地理解Java中的继承、方法重写以及构造器的相关特性!

相关文章:

  • 基于langchain实现GraphRAG:基于图结构的检索增强生成系统
  • Linux(24)——系统调优
  • MySQL数据库和表的操作之数据库表操作
  • Day3 蓝桥杯省赛冲刺精炼刷题 —— 排序算法与贪心思维
  • 静态路由与BFD联动实验配置
  • TCP、HTTP、HTTPS、DNS的原理
  • 科技潮流出行新体验 方程豹全新车型钛3正式开启预售
  • linux服务器专题1------redis的安装及简单配置
  • 【跑步计划,日期推算】
  • 我的世界模组进阶开发教程——地形生成(2)
  • C语言基础数据类型
  • RAG 调优指南:Spring AI Alibaba 模块化 RAG 原理与使用
  • Linux进程间通信:【目的】【管道】【匿名管道】【命名管道】【System V 共享内存】
  • 自动驾驶浪潮下,HMI 设计如何保障安全与便捷?
  • PyTorch中知识蒸馏浅讲
  • 文件压缩与解压(zip4j)
  • SnapdragonCamera骁龙相机源码解析
  • 【C++指南】一文总结C++二叉搜索树
  • 【Linux】传输层协议 TCP
  • Vue3实现锚点定位
  • 焦点访谈丨售假手段又翻新,警惕化肥“忽悠团”的坑农套路
  • 中沙深化多领域合作,达成60余项共识
  • 兴业证券:下半年A股指数稳、结构牛,中国资产重估刚刚开始
  • 4月中国常青游戏榜:32款游戏吸金近34亿元,腾讯、网易占半壁江山,《原神》再跌出前十
  • 改造老旧小区、建立“一张图”,五部委将多举措支持城市更新
  • 上海将完善隔代照料支持措施:建设老幼共享设施、提高科学育儿指导力度