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中的继承、方法重写以及构造器的相关特性!

相关推荐
karry_k14 小时前
MyBatis批量insert-select踩坑:useGeneratedKeys=true 可能让PostgreSQL返回大量插入结果
java·后端
karry_k14 小时前
PostgreSQL 在 MyBatis 中执行正常 SQL 失效:一次 DELETE USING 踩坑记录
java·后端
SamDeepThinking17 小时前
从源码到代码:MyBatis-Flex 与 MyBatis-Plus 的逐项对比
java·后端·程序员
她的男孩20 小时前
Spring Boot 接 Flowable 工作流:用 3 个注解搭一个请假审批流程
java·后端·架构
荣码1 天前
LLM结构化输出:让AI返回JSON而不是废话,我踩了4个坑
java·python
plainGeekDev1 天前
Gson → kotlinx.serialization
android·java·kotlin
小bo波1 天前
Java Swing 图形用户界面实验 —— 从算术练习到游戏开发的完整实践
java·课程设计·gui·游戏开发·扫雷·swing
咖啡八杯1 天前
GoF设计模式——备忘录模式
java·后端·spring·设计模式