”工欲善其事,必先利其器。“—孔子《论语.录灵公》
首页 > 编程 > Java 中的构造函数重载

Java 中的构造函数重载

发布于2024-11-08
浏览:772

Constructor Overloading in Java

构造函数在初始化类中起着至关重要的作用。但您是否知道在 Java 中,一个类可以有多个构造函数?这个概念称为构造函数重载,该功能允许您根据提供的参数以不同的方式创建对象。在本文中,我们将深入探讨构造函数重载,探讨其好处,并查看实际示例。

什么是构造函数重载?

构造函数重载在Java中意味着同一个类中有多个构造函数,每个构造函数都有不同的参数列表。构造函数通过其参数的数量和类型来区分。这允许您根据实例化对象时可用的数据来创建具有不同初始状态的对象。

为什么要使用构造函数重载?

构造函数重载很有用,原因如下:

  • 灵活性:它提供了多种方式来创建具有不同初始值的对象。
  • 方便:你的类的用户可以根据他们拥有的信息选择调用哪个构造函数。
  • 代码可重用性:它允许默认设置,同时仍然启用自定义。

构造函数重载的示例

让我们考虑一个 Employee 类的简单示例,看看构造函数重载在实践中是如何工作的:

public class Employee {
    private String name;
    private int id;
    private double salary;

    // Constructor 1: No parameters
    public Employee() {
        this.name = "Unknown";
        this.id = 0;
        this.salary = 0.0;
    }

    // Constructor 2: One parameter (name)
    public Employee(String name) {
        this.name = name;
        this.id = 0;
        this.salary = 0.0;
    }

    // Constructor 3: Two parameters (name and id)
    public Employee(String name, int id) {
        this.name = name;
        this.id = id;
        this.salary = 0.0;
    }

    // Constructor 4: Three parameters (name, id, and salary)
    public Employee(String name, int id, double salary) {
        this.name = name;
        this.id = id;
        this.salary = salary;
    }

    public void displayInfo() {
        System.out.println("Name: "   name   ", ID: "   id   ", Salary: "   salary);
    }
}

它是如何运作的?

上面的 Employee 类中:

  • 构造函数 1 是一个无参构造函数,用于设置名称、id 和薪水的默认值。
  • 构造函数2允许设置name,id和salary默认为0。
  • 构造函数3允许您设置name和id,而salary仍然默认为0。
  • 构造函数 4 使您可以灵活地设置所有三个字段:姓名、id 和薪水。

例子

以下是如何在 Main 类中使用这些构造函数的示例:

public class Main {
    public static void main(String[] args) {
        // Using the no-argument constructor
        Employee emp1 = new Employee();
        emp1.displayInfo(); // Output: Name: Unknown, ID: 0, Salary: 0.0

        // Using the constructor with one argument
        Employee emp2 = new Employee("Alice");
        emp2.displayInfo(); // Output: Name: Alice, ID: 0, Salary: 0.0

        // Using the constructor with two arguments
        Employee emp3 = new Employee("Bob", 123);
        emp3.displayInfo(); // Output: Name: Bob, ID: 123, Salary: 0.0

        // Using the constructor with three arguments
        Employee emp4 = new Employee("Charlie", 456, 50000.0);
        emp4.displayInfo(); // Output: Name: Charlie, ID: 456, Salary: 50000.0
    }
}

构造函数链接

Java 还允许您使用 this() 从同一类中的另一个构造函数调用一个构造函数。这称为 构造函数链接 ,对于重用代码很有用:

public Employee(String name) {
    this(name, 0, 0.0); // Calls the constructor with three parameters
}

在此示例中,具有一个参数(名称)的构造函数调用具有三个参数的构造函数,为 id 和 salary 提供默认值。

记住

  1. 重载规则:构造函数的参数列表必须不同(数量、类型或两者)。它们不能仅在返回类型上有所不同(构造函数没有返回类型)。
  2. 默认构造函数:如果没有定义构造函数,Java提供默认的无参构造函数。但是,如果您定义任何构造函数,则不会提供默认构造函数,除非您显式定义它。

构造函数重载的优点

  • 用户灵活性:您班级的用户可以根据自己的需要以多种方式初始化对象。
  • 简化代码:有助于避免单个构造函数中的长参数列表,提高代码可读性和可维护性。

结论

Java 中的构造函数重载是一种在使用多个构造函数创建类时提供灵活性和便利性的功能。通过提供多种方法来实例化一个类。

版本声明 本文转载于:https://dev.to/emleons/constructor-overloading-in-java-1c53?1如有侵犯,请联系[email protected]删除
最新教程 更多>
  • 如何在其容器中为DIV创建平滑的左右CSS动画?
    如何在其容器中为DIV创建平滑的左右CSS动画?
    通用CSS动画,用于左右运动 ,我们将探索创建一个通用的CSS动画,以向左和右移动DIV,从而到达其容器的边缘。该动画可以应用于具有绝对定位的任何div,无论其未知长度如何。问题:使用左直接导致瞬时消失 更加流畅的解决方案:混合转换和左 [并实现平稳的,线性的运动,我们介绍了线性的转换。这...
    编程 发布于2025-04-14
  • 为什么使用Firefox后退按钮时JavaScript执行停止?
    为什么使用Firefox后退按钮时JavaScript执行停止?
    导航历史记录问题:JavaScript使用Firefox Back Back 此行为是由浏览器缓存JavaScript资源引起的。要解决此问题并确保在后续页面访问中执行脚本,Firefox用户应设置一个空功能。 警报'); }; alert('inline Alert')...
    编程 发布于2025-04-14
  • 为什么PYTZ最初显示出意外的时区偏移?
    为什么PYTZ最初显示出意外的时区偏移?
    与pytz 最初从pytz获得特定的偏移。例如,亚洲/hong_kong最初显示一个七个小时37分钟的偏移: 差异源利用本地化将时区分配给日期,使用了适当的时区名称和偏移量。但是,直接使用DateTime构造器分配时区不允许进行正确的调整。 example pytz.timezone(...
    编程 发布于2025-04-14
  • 为什么我的CSS背景图像出现?
    为什么我的CSS背景图像出现?
    故障排除:CSS背景图像未出现 ,您的背景图像尽管遵循教程说明,但您的背景图像仍未加载。图像和样式表位于相同的目录中,但背景仍然是空白的白色帆布。而不是不弃用的,您已经使用了CSS样式: bockent {背景:封闭图像文件名:背景图:url(nickcage.jpg); 如果您的html,css...
    编程 发布于2025-04-14
  • 大批
    大批
    [2 数组是对象,因此它们在JS中也具有方法。 切片(开始):在新数组中提取部分数组,而无需突变原始数组。 令ARR = ['a','b','c','d','e']; // USECASE:提取直到索引作...
    编程 发布于2025-04-14
  • 如何有效地转换PHP中的时区?
    如何有效地转换PHP中的时区?
    在PHP 利用dateTime对象和functions DateTime对象及其相应的功能别名为时区转换提供方便的方法。例如: //定义用户的时区 date_default_timezone_set('欧洲/伦敦'); //创建DateTime对象 $ dateTime = ne...
    编程 发布于2025-04-14
  • 在细胞编辑后,如何维护自定义的JTable细胞渲染?
    在细胞编辑后,如何维护自定义的JTable细胞渲染?
    在JTable中维护jtable单元格渲染后,在JTable中,在JTable中实现自定义单元格渲染和编辑功能可以增强用户体验。但是,至关重要的是要确保即使在编辑操作后也保留所需的格式。在设置用于格式化“价格”列的“价格”列,用户遇到的数字格式丢失的“价格”列的“价格”之后,问题在设置自定义单元格...
    编程 发布于2025-04-14
  • 如何正确使用与PDO参数的查询一样?
    如何正确使用与PDO参数的查询一样?
    在pdo 中使用类似QUERIES在PDO中的Queries时,您可能会遇到类似疑问中描述的问题:此查询也可能不会返回结果,即使$ var1和$ var2包含有效的搜索词。错误在于不正确包含%符号。通过将变量包含在$ params数组中的%符号中,您确保将%字符正确替换到查询中。没有此修改,PDO...
    编程 发布于2025-04-14
  • Go web应用何时关闭数据库连接?
    Go web应用何时关闭数据库连接?
    在GO Web Applications中管理数据库连接很少,考虑以下简化的web应用程序代码:出现的问题:何时应在DB连接上调用Close()方法?,该特定方案将自动关闭程序时,该程序将在EXITS EXITS EXITS出现时自动关闭。但是,其他考虑因素可能保证手动处理。选项1:隐式关闭终止数...
    编程 发布于2025-04-14
  • 可以在纯CS中将多个粘性元素彼此堆叠在一起吗?
    可以在纯CS中将多个粘性元素彼此堆叠在一起吗?
    [2这里: https://webthemez.com/demo/sticky-multi-header-scroll/index.html </main> <section> { display:grid; grid-template-...
    编程 发布于2025-04-14
  • 在SQL Server中如何将所有大写文本转换为适当的大小写,同时处理非英语字符和空格变化?
    在SQL Server中如何将所有大写文本转换为适当的大小写,同时处理非英语字符和空格变化?
    [2 [2 本文详细介绍了一个可靠的SQL Server函数,旨在将大写文本转换为适当的情况,同时解决诸如非英语字符和变化的空格等复杂性。 该函数提供了几个关键优势: 处理whitespace变体:正确处理多个空格和各种空间字符(包括销售折断,tabs和非断裂空间)。 支持非英语字母:准确地处理包...
    编程 发布于2025-04-14
  • 对象拟合:IE和Edge中的封面失败,如何修复?
    对象拟合:IE和Edge中的封面失败,如何修复?
    To resolve this issue, we employ a clever CSS solution that solves the problem:position: absolute;top: 50%;left: 50%;transform: translate(-50%, -50%)...
    编程 发布于2025-04-14
  • JavaScript中如何动态访问全局变量?
    JavaScript中如何动态访问全局变量?
    在JavaScript 一种方法是使用窗口对象存储和检索变量。通过引用全局范围,可以使用其名称动态访问变量。 //一个脚本 var somevarname_10 = 20; //另一个脚本 window.all_vars = {}; window.all_vars ['somevarnam...
    编程 发布于2025-04-14
  • 浅拷贝Python字典更新为何不影响原字典?
    浅拷贝Python字典更新为何不影响原字典?
    在Python dictionaries中理解浅复制:为什么复制中的更新不会影响原始在使用Python dictionaries时,了解sallow sallow和shallow and shallow和deep coplying和deep coppoding shallow和deep coply...
    编程 发布于2025-04-14
  • \“(1)vs.(;;):编译器优化是否消除了性能差异?\”
    \“(1)vs.(;;):编译器优化是否消除了性能差异?\”
    答案: 在大多数现代编译器中,while(1)和(1)和(;;)之间没有性能差异。编译器: perl: 1 输入 - > 2 2 NextState(Main 2 -E:1)V-> 3 9 Leaveloop VK/2-> A 3 toterloop(next-> 8 last-> 9 ...
    编程 发布于2025-04-14

免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。

Copyright© 2022 湘ICP备2022001581号-3