Java中的构造函数与继承

发布:2024-09-17 14:49 阅读:81 点赞:0

一. 构造函数概述

构造函数是用于初始化对象的特殊方法,它们与类名相同。构造函数在创建对象时会被自动调用。构造函数不仅用于初始化对象的状态,还会分配内存。对于继承结构中的类,子类的构造函数会调用父类的构造函数来确保父类的状态被正确初始化。

1.1. 基类构造函数

基类的构造函数负责初始化基类的属性,并在创建基类对象时被调用。基类的构造函数不会被子类继承,因此需要在子类的构造函数中显式调用基类的构造函数,以确保基类部分被正确初始化。

1.2. 子类构造函数

子类的构造函数同样负责初始化子类特有的属性,并会在创建子类对象时被调用。在子类构造函数中,通常需要先调用基类构造函数,确保基类的状态已经被正确设置。

二. 基类构造函数示例

2.1. 示例代码

class Author {
    // 基类构造函数
    Author() {
        System.out.println("In the Author class"); // 输出基类构造函数的消息
    }
}

class FictionAuthor extends Author {
    // 派生类构造函数
    FictionAuthor() {
        System.out.println("In the Fiction Author class"); // 输出派生类构造函数的消息
    }
}

class TestAuthor {
    // 测试类的构造函数
    TestAuthor() {
    }

    public static void main(String[] args) {
        FictionAuthor ficauthor = new FictionAuthor(); // 创建派生类对象
    }
}

2.2. 输出结果

当创建 FictionAuthor 对象时,首先调用 Author 类的构造函数,然后调用 FictionAuthor 类的构造函数。这确保了基类部分被初始化后,派生类部分才能被正确设置。

三. 使用 super 调用基类构造函数

3.1. 示例代码

class Author {
    String name;

    // 带参数的基类构造函数
    Author(String str) {
        name = str; // 初始化name属性
        System.out.println("Printing from the Author class"); // 输出基类构造函数的消息
        System.out.println("The name is " + name); // 输出name属性的值
    }
}

class FictionAuthor extends Author {
    String storytype;

    // 带参数的派生类构造函数
    FictionAuthor(String name, String type) {
        super(name); // 调用基类构造函数,传递name参数
        storytype = type; // 初始化storytype属性
        System.out.println("Printing from the Fiction Author class"); // 输出派生类构造函数的消息
        System.out.println("Type is " + storytype); // 输出storytype属性的值
    }
}

class TestingAuthor {
    // 测试类的构造函数
    TestingAuthor() {
    }

    public static void main(String[] args) {
        FictionAuthor ficauthor = new FictionAuthor("Ashish Bhatnagar""Novel"); // 创建派生类对象,并传递参数
    }
}

3.2. 输出结果

在 FictionAuthor 类中,使用 super(name) 调用 Author 类的构造函数,传递了 name 参数来初始化 name 属性。接着,FictionAuthor 构造函数初始化 storytype 属性,并生成相应的输出结果。构造函数的调用顺序确保了对象的正确初始化。

四. 总结

在 Java 中,构造函数用于初始化对象和分配内存,它们与类名相同。子类在创建对象时,会继承基类的所有方法和属性,但构造函数不会被继承。为了确保基类的正确初始化,子类构造函数必须显式调用基类构造函数。Java 自动在没有显式构造函数的情况下调用基类构造函数,并且基类构造函数总是在子类构造函数之前执行。