【Java14】构造器

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.mzph.cn/news/868648.shtml

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

相关文章

【CSAPP】-cachelab实验

目录 实验目的与要求 实验设备与软件环境 实验过程与结果(可贴图) 操作异常问题与解决方案 实验总结 实验目的与要求 1、掌握应用程序性能的优化方法; 2、理解存储器层次结构在程序运行过程中所起的重要作用; 3、让学生更好…

高考志愿填报的六个不要

在高考志愿填报这个关键时刻,确实需要谨慎行事,避免一些常见的错误。以下是高考志愿填报的六个“不要”,希望能为你提供一些有用的建议: 1、不要盲目跟风 每个人的兴趣、能力和未来规划都不同,不要仅仅因为某个专业或…

Gradle基础:从入门到掌握

人不走空 🌈个人主页:人不走空 💖系列专栏:算法专题 ⏰诗词歌赋:斯是陋室,惟吾德馨 在现代软件开发中,自动化构建工具是提高效率和管理依赖的重要手段。而Gradle作为一种灵活且强大的构…

python基础篇(9):模块

1 模块简介 Python 模块(Module),是一个 Python 文件,以 .py 结尾. 模块能定义函数,类和变量,模块里也能包含可执行的代码. 模块的作用: python中有很多各种不同的模块, 每一个模块都可以帮助我们快速的实现一些功能, 比如实现…

工业4.0视角下:PLC转OPC UA网关的作用

在工业自动化领域,PLC(可编程逻辑控制器)是常见的控制设备,而OPC UA(开放型工业自动化统一架构)协议则是一种现代化的通信协议,用在工厂自动化系统中实现设备之间的数据交换和通信。PLC转OPC U…

TensorRT动态形状(Dynamic Shape)出错,官方demo+自己模型运行时出错

(2024.7.2) 使用TensorRT处理动态输入形状推理时出现的错误,本案基于官方demo文件,已解决: TensorRT版本10.0,官方例子使用的是这个https://github.com/NVIDIA/trt-samples-for-hackathon-cn/blob/master/cookbook/01-SimpleDem…

贝叶斯估计(1):期末大乱炖

写在前面! 1 先验分布和后验分布 三种信息:总体信息、样本信息、先验信息 总体信息:“总体是正态分布”;样本信息:总体抽取的样本提供的信息,是最新鲜的信息;先验信息:在抽样之前就…

Excel数据截取及合并多行多列数据

公式一:RIGHT(A2,LEN(A2)-FINDB(")",A2)) 公式二:PHONETIC(C2:D19) 详情可以看附件。

AJAX快速入门(一) express框架的安装和使用范例

主打一个有用 首先保证安装了nodejs环境 打开终端 初始化npm npm init安装express npm i express测试样例 目录结构 样例代码 express.js //引入express const express require(express);//创建应用对象 const app express();//创建路由规则 //req是请求对象&#x…

一文清晰了解HTML——简单实例

想要仿照该页面编写HTML代码&#xff1a; 在vscode中输入&#xff01;自动生成默认模板&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevic…

第二证券股市资讯:深夜!突然暴涨75%!

一则重磅收买引发医药圈轰动。 北京时间7月8日晚间&#xff0c;美股开盘后&#xff0c;美国生物制药公司Morphic股价一度暴升超75%。音讯面上&#xff0c;生物医药巨子礼来公司官宣&#xff0c;将以57美元/股的价格现金收买Morphic&#xff0c;较上星期五的收盘价溢价79%&…

19_谷歌GoogLeNet(InceptionV1)深度学习图像分类算法

1.1 简介 GoogLeNet&#xff08;有时也称为GoogleNet或Inception Net&#xff09;是一种深度学习架构&#xff0c;由Google的研究团队在2014年提出&#xff0c;主要设计者为Christian Szegedy等人。这个模型是在当年的ImageNet大规模视觉识别挑战赛&#xff08;ILSVRC&#xf…

什么是T0策略?有没有可以持仓自动做T的策略软件?

​​行情低迷&#xff0c;持仓被套&#xff0c;不想被动等待&#xff1f;长期持股&#xff0c;想要增厚持仓收益&#xff1f;有没有可以自动做T的工具或者策略&#xff1f;日内T0交易&#xff0c;做到降低持仓成本&#xff0c;优化收益预期。 什么是T0策略&#xff1f; 可以提…

韦东山嵌入式linux系列-LED驱动程序

之前学习STM32F103C8T6的时候&#xff0c;学习过对应GPIO的输出&#xff1a; 操作STM32的GPIO需要3个步骤&#xff1a; 使用RCC开启GPIO的时钟、使用GPIO_Init函数初始化GPIO、使用输入/输出函数控制GPIO口。 【STM32】GPIO输出-CSDN博客 这里再看看STM32MP157的GPIO引脚使用…

jmeter-beanshell学习5-beanshell加减乘除运算

我用到的场景是计算金额&#xff0c;所以主要以金额为主&#xff0c;感觉这部分有点麻烦&#xff0c;直接写遇到的几个坑&#xff0c;就不演示解决的过程了。 1.最早写了个两数相减&#xff0c;但是小数精度容易出现问题。比如1-0.010.989999997这种情况&#xff0c;随便写的几…

初学SpringMVC之执行原理

Spring MVC 是基于 Java 实现 MVC 的轻量级 Web 框架 导入 jar 包 pom.xml 文件导入依赖&#xff1a; <dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.13.2</version></dependency><dep…

YOLOv9:一个关注信息丢失问题的目标检测

本文来自公众号“AI大道理” 当前的深度学习方法关注的是如何设计最合适的目标函数&#xff0c;使模型的预测结果最接近地面的真实情况。同时&#xff0c;必须设计一个适当的体系结构&#xff0c;以方便获取足够的预测信息。 现有方法忽略了一个事实&#xff0c;即输入数据在逐…

docker安装以及简单使用

如何安装安装 yum install -y yum-utils yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo # 列出可用的版本 yum list docker-ce.x86_64 --showduplicates | sort -r yum install -y docker-ce-23.0.6-1.el8 #开机自动启动 …

day02_员工管理

文章目录 新增员工需求分析和设计代码开发功能测试代码完善录入的用户名已存在&#xff0c;抛出异常后没有处理新增员工的时候&#xff0c;创建人id和修改人id设置为了固定值ThreadLocal&#xff08;面试题&#xff09; 分页查询问题解决 启用禁用员工账号需求和分析代码设计 编…

Vue3项目打包优化

前言 本文介绍在实际项目中进行打包优化过程 目前评分 good npm install web-vitals在App.vue加入如下代码测试网页性能指标 import { onLCP, onINP, onCLS, onFCP, onTTFP } from web-vitals/attributiononCLS(console.log) onINP(console.log) onLCP(console.log) onFCP(…