【Java14】构造器

news2024/11/14 17:36:32

Java中的构造器在创建对象(实例)的时候执行初始化。Java类必须包含一个或一个以上的构造器。

Java中的构造器类似C++中的构造函数。

Java中对象(object)的默认初始化规则是:

  • 数值型变量初始化为0;
  • 布尔型变量初始化为false
  • 引用变量初始化为null

如果类中没有任何显式定义的构造器,系统会提供一个无参数的构造器,这个构造器执行体为空,不做任何事情(但是实际上执行了默认初始化)。

通过自定义构造器就能执行自定义的初始化:

public class ConstructorTest
{
  public String name;
  public int count;
  // 这个自定义的构造器允许从外面传递两个参数进来进行成员变量name和count的初始化
  public ConstructorTest(String name, int count)
  {
    this.name = name;
    this.count = count;
  }
  public static void main(String[] args)
  {
    var tc = new ConstructorTest("疯狂Java讲义", 90000);
    System.out.println(tc.name); // 初始化为”疯狂Java讲义“
    System.out.println(tc.count); // 初始化为90000
  }
}

构造器是创建Java对象的途径,是不是说构造器完全负责创建Java对象?

不是。当通过关键字new调用构造器时,构造器返回了该类的对象。但是,这个对象并不是完全由构造器创建的。

  • 实际上,调用构造器时,系统首先为该对象分配内容,并对这个对象执行默认初始化,这时这个对象已经产生了。只不过这个对象不能被外部程序访问。

  • 而在构造器内,这个临时对象以this的形态存在。

  • 当构造器执行完毕后,这个对象以构造器的返回值(注意构造器并没有显式定义返回值,但默认返回值就是对象的引用)被返回,通常直接赋值给一个引用变量,从而让外部程序可以访问这个对象。

在上述过程中,一个默认的对象首先在内存中出现;接着是使用构造器实现自定义的初始化;最后是返回这个对象供外部使用。

一旦类中提供了自定义的构造函数,默认的无参构造函数就不存在了

当然,用户可以自行定义无参的构造函数。实际上,可以为这个类提供多个构造器(想一想方法的重载)。

一般情况下,构造器是public的。但是,如果仅供子类使用,可以修饰为protected;如果不想让其他类创建该类的实例,可以用private修饰。

构造器的访问权限,是实现几种设计模式的基础。

构造器在重载时,有一种情况是构造器B的执行体覆盖了构造器A的执行体,如图所示:

在这里插入图片描述

这种情况下,可以在方法B中调用方法A来简化代码。但是,构造器当做普通函数来直接调用,而必须通过new来调用。而一旦在构造器B中使用new来调用构造器A,就会在内存中重新创建一个对象。

既要在B中调用A,又不想创建额外的对象,方法就是依然使用构造器B来new对象,但是利用this来调用构造器A的构造器:

public class Apple
{
  public String name;
  public String color;
  public double weight;
  public Apple(){}
  public Apple(String name, String color)
  {
    this.name = name;
    this.color = color;
  }
  public Apple(String name, String color, double weight)
  {
    // 利用this调用另一个重载的构造器
    this(name, color); // 取代了new关键字,避免分配新的对象内存
    this.weight = weight; // 使用this初始化其他部分
  }
}

使用this调用其他构造器的话,这句话必须做为当前构造器执行体的第一句。系统会根据this后括号里的实参来确定是哪一个构造器。

这么做有啥用?我为啥不能把构造器A的代码粘贴过来?

当然可以!但是软件工程有一个理念:不要把相同的代码书写两次以上!

想象一下,如果有多个构造器A,B,C……,他们都包含了一段相同的代码。如果有一天,A的代码改了,那么就要把B,C……都打开,把对应修改的代码给粘贴进来。但是使用this的话,A修改完,B,C……就自动被修改了。既省事,又避免冗长代码带来的可能的错误。

我们的理念:充分复用每一段代码。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1907967.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

记录一次Nginx的使用过程

一、Docker安装配置nginx 1.拉取镜像 docker pull nginx2.创建挂载目录 启动前需要先创建Nginx外部挂载目录文件夹 主要有三个目录 conf:配置文件目录log:日志文件目录html:项目文件目录(这里可以存放web文件) 创建挂…

智能视频监控中心 - 详细介绍

目录 一、概述 (一)定义 (二)作用 1、系统安全性 2、整体管理效率 3、数据支持决策 4、促进企业集团化和智慧城市发展 二、原理和组成 (一)原理 (二)组网图 (…

MATLAB常用的插值方法

在数学建模中,我们拿到的数据经常会有缺失值,在缺失值不是很多的情况下,我们在数据预处理阶段会采用插值方法来将数据补齐,之后再开始我们的建模。 目录 1.Matlab 实现分段线性插值 2.拉格朗日插值多项式 3.牛顿(…

OSCNET+ 代码复现

项目github 已有,开个博客大家如果复现有问题可以随时在下面留言 github :GitHub - hongwang01/OSCNet: 【MICCAI 2022, TMI 2023】Orientation-Shared Convolution Representation Model 1、从github 下载项目并解压 2、下载数据集 当然自己用肯定是自…

C语言实现顺序表字符型数据排序

实现直接插入、冒泡、直接选择排序算法。 #include <stdio.h> #include <stdlib.h>typedef char InfoType;#define n 10 //假设的文件长度&#xff0c;即待排序的记录数目 typedef char KeyType; //假设的关键字类型 typedef struct { //记录类型KeyType…

超详细版阿里云控制台环境配置+数据库配置

一、登录阿里云控制台 登录阿里云控制台&#xff0c;找到实例&#xff0c;切到阿里云服务器所在地址 &#x1f36d;不知道自己的服务器地址在哪边也没有关系&#xff0c;随便选择一个&#xff0c;查询不到记录的话会有以下提示&#xff0c;可以根据提示进行切换&#xff08;适…

Mac系统清理工具:您的数字生活杂务处理师

有没有觉得您的Mac有时候像是需要一个好的春季大扫除一样&#xff1f;随着我们不断使用电脑&#xff0c;各种不需要的文件、老旧的数据和忘记的安装包就像家里的灰尘一样慢慢积累。幸运的是&#xff0c;有了一些出色的Mac系统清理工具&#xff0c;我们可以轻松将这些数字灰尘拂…

含金废水的特性?如何提取含金废液中的黄金?

在金的工业使用过程和回收过程中都会产生含金废液&#xff0c;通常来自金矿冶炼、电子废弃物处理、珠宝制作和其他工业过程。由于黄金是一种贵重的贵金属&#xff0c;金废水的回收和处理是环保和资源可持续利用的关键领域之一&#xff0c;但是金的含量多数较低、甚至是微量、痕…

华为od相关信息分享

2024年OD统一考试&#xff08;D卷&#xff09;完整题库&#xff1a;华为OD机试2024年最新题库&#xff08;Python、JAVA、C合集&#xff09; 问 1.什么是华为od&#xff1f; 答&#xff1a;OD全称是Outsourcing Dispacth&#xff0c;即外包派遣&#xff0c;是华为和外企德科…

昇思MindSpore学习笔记5-02生成式--RNN实现情感分类

摘要&#xff1a; 记录MindSpore AI框架使用RNN网络对自然语言进行情感分类的过程、步骤和方法。 包括环境准备、下载数据集、数据集加载和预处理、构建模型、模型训练、模型测试等。 一、概念 情感分类。 RNN网络模型 实现效果&#xff1a; 输入: This film is terrible 正…

Kotlin linkedMapOf filterKeys

Kotlin linkedMapOf filterKeys fun main(args: Array<String>) {val lhm linkedMapOf<String, Any>(Pair("name", "phil"), //因为key相同都为 name&#xff0c;被后面的覆盖。Pair("year", 2024),Pair("name", "f…

顶会FAST24最佳论文|阿里云块存储架构演进的得与失-1.引言

今年早些时候&#xff0c;2月份举办的全球计算机存储顶会USENIX FAST 2024&#xff0c;最佳论文来自阿里云&#xff0c;论文名称《What’s the Story in EBS Glory: Evolutions and Lessons in Building Cloud Block Store》 &#xff0c;论文详尽地探讨了阿里云在过去十年中开…

新增多种图表类型,新增插件管理模块,DataEase开源数据可视化分析工具v2.8.0发布

2024年7月8日&#xff0c;人人可用的开源数据可视化分析工具DataEase正式发布v2.8.0版本。 这一版本的功能变动包括&#xff1a;图表方面&#xff0c;新增组合图、热力地图、符号地图、K线图等图表类型&#xff0c;并对已有的仪表盘、明细表、指标卡、富文本等图表类型进行了功…

Java之父James Gosling宣布正式退休 创造无数人的饭碗

编程语言Java的创始人&#xff0c;被誉为“Java之父”的James Gosling&#xff0c;近日在社交媒体上宣布了自己正式退休的消息。Gosling表示&#xff1a;“我终于退休了。做了这么多年的软件工程师&#xff0c;现在是时候享受人生了。”他透露&#xff0c;在亚马逊的过去7年是非…

手写《C++20设计模式》中介者模式

文章目录 一、前言二、实现1、UML类图2、实现 一、前言 个人感觉最后几种行为模式都很难&#xff0c;而且很重要。 对于中介者模式浅层理解就是&#xff0c;从原来所有相关对象彼此通信变为&#xff0c;引入一个中介者对象&#xff0c;让所有的相关对象通过中介者来通信&#…

wait和sleep在同步方面的区别

在 Java 中&#xff0c;wait 和 sleep 都用于让线程进入等待状态&#xff0c;但它们在同步操作和线程管理方面有显著区别。以下是它们的主要区别&#xff1a; 1. 所属的类 wait 是 Object 类的方法。sleep 是 Thread 类的静态方法。 2. 使用场景 wait 用于线程间通信&#…

鸿蒙开发小案例(名片管理))

鸿蒙开发小案例&#xff08;名片管理&#xff09; 1、页面效果1.1 初始页面1.2 点击名片展开1.3 点击收藏1.4 点击编辑按钮 2、实现代码2.1 DataModel.ets2.2 RandomUtil.ets2.3 ContactList.ets 1、页面效果 1.1 初始页面 1.2 点击名片展开 1.3 点击收藏 1.4 点击编辑按钮 2、…

第二证券:资金抱团“高股息”,超三成A股年内创历史新低!

A股商场行情冰火两重天。 “预制菜榜首股”跌破发行价 7月8日&#xff0c;味知香盘中最低跌至19.26元/股&#xff0c;股价跌破发行价&#xff0c;并创前史新低。揭露资料显现&#xff0c;公司是集研发、生产、销售为一体的半成品菜企业&#xff0c;现在具有8大产品系列&#…

短视频矩阵系统源代码开发---多种剪辑逻辑再次升级

揭秘AI短视频运营秘籍&#xff0c;轻松涨粉&#xff01; 1、数据管理方面&#xff0c;我们提供了全面的账号及视频Top 10的数据统计服务。 2、在AI视频创意制作领域&#xff0c;我们采用原创视频批量剪辑、阶乘算法和去重原理&#xff0c;以提升内容的独特性和吸引力。 3、同…

腾讯发布2024大模型十大最新趋势!

近日&#xff0c;在2024世界人工智能大会上&#xff0c;腾讯正式发布了《2024大模型十大趋势——走进“机器外脑”时代》报告。目前&#xff0c;这一报告正在AI产业界各大社群快速传播。 报告中&#xff0c;腾讯研究院试图通过10个关键性的趋势&#xff0c;去理解全世界范围内正…