【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.mfbz.cn/a/784558.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

为什么KV Cache只需缓存K矩阵和V矩阵,无需缓存Q矩阵?

大家都知道大模型是通过语言序列预测下一个词的概率。假定{ x 1 x_1 x1​, x 2 x_2 x2​, x 3 x_3 x3​,…, x n − 1 x_{n-1} xn−1​}为已知序列,其中 x 1 x_1 x1​, x 2 x_2 x2​, x 3 x_3 x…

EAI四个层次服务-系统架构师(二十六)

1、(重点)系统应用集成提供了4个不同层次服务,最上层服务是()服务。 解析: EAI(Enterprise Application Integration)系统应用集成,相关概念。 实施EAI必须保证:应用程…

2024年信息素养大赛图形化编程小低组复赛真题-附答案 6547网

2024年全国青少年信息素养大赛图形化编程小低组复赛真题 题目总数:6 总分数:100 第1部分 第 1 题 问答题 【编程实现】点击小绿旗,实现将鱼的所有造型印到舞台区 【具体要求】 1. 将鱼显示出来 全部擦除所有内容 2. 将鱼的造型设…

202488读书笔记|《365日创意文案》——无聊的 到底是这世间, 还是自己?懂得忘却的人才能前进

202488读书笔记|《365日创意文案》——无聊的 到底是这世间, 还是自己?懂得忘却的人才能前进 1月2月3月4月5月6月7月8月9月10月11月12月 《365日创意文案》WRITES PUBLISHING,一些日常,是烟火,也是幸福的印记。 当下也…

二次元转向SLG,B站游戏的破圈之困

文 | 螳螂观察 作者 | 夏至 2023年是B站游戏的滑铁卢,尽管这年B站的游戏营收还有40多亿,但相比去年大幅下降了20%,整整少了10亿,这是过去5年来的最大跌幅,也是陈睿接管B站游戏业务一年以来,在鼻子上碰的第…

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

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

基于docker的prometheus+grafana+altermanager+prometheus-webhook-dingtalk钉钉报警

一、各软件功能简介 prometheus:Prometheus(是由go语言(golang)开发)是一套开源的监控&报警&时间序列数 据库的组合。主要优点:外部依赖安装使用超简单、系统集成 多等 grafana:Grafana 是一款采用 go 语言编写的开源应用&#xff0…

APP明暗主题设置

1.preference.xml 增加一个暗色主题 SwitchPreference 2.每个 Activity 的 setContentView 前面增加 setTheme SharedPreferences sharedPreferences PreferenceManager.getDefaultSharedPreferences(this); if (sharedPreferences.getBoolean("switch_dark_theme"…

uniapp-小程序获取用户位置

1. 需要在微信公众平台进行接口的申请。选择自己需要用的接口。 2. 在app.json文件中配置permission和requiredPrivateInfos。requiredPrivateInfos里面是你需要使用的接口。 3. 配置完成后,就可以使用了。 相关获取位置API的链接 4. 如果要获取当前位置到某一个指…

电商数据仓库

目录 1.数据仓库的数据来源为业务数据库(mysql) 初始化脚本 2.通过sqoop将mysql中的业务数据导入到大数据平台(hive) 在hive中建立映射的数据库 导入数据 3.通过hive进行数据计算和数据分析 形成数据报表 补全用户信息表中的…

DNS知识点

📑打牌 : da pai ge的个人主页 🌤️个人专栏 : da pai ge的博客专栏 ☁️宝剑锋从磨砺出,梅花香自苦寒来 ​ 目录 一、DNS概念 二hosts 文件 DNS优缺点 三客户端域名解析顺序(优先级) 四原…

数据结构--堆,堆排序

1.树概念及结构 1.1树的概念 树是一种 非线性 的数据结构,它是由 n ( n>0 )个有限结点组成一个具有层次关系的集合。 把它叫做树是因 为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的 。 有一个 特殊的结…

PCIe 入门 Demo(一):基础知识

PCIe 入门 Demo(一):基础知识 主要参考 up主 芯片人阿伟 的教程【针对 RISC-V 架构】 视频介绍:https://www.bilibili.com/video/BV1Xm4y1V757 源码仓库:https://github.com/oldawei/show_me_the_code 本文主要补充一些…

STM32对数码管显示的控制

1、在项目开发过程中会遇到STM32控制的数码管显示应用,这里以四位共阴极数码管显示控制为例讲解;这里采用的控制芯片为STM32F103RCT6。 2、首先要确定数码管的段选的8个引脚连接的单片机的引脚是哪8个,然后确认位选的4个引脚连接的单片机的4…

OS Copilot测评-CSDN

登录控制台 安装插件 sudo yum install -y os-copilot效果如下 配置 AccessKey ID 与 AccessKey Secret 注意安全,使用完成后,别忘了去控制台删除,一般情况使用子Key就可以 检测是否可用 co hi实际操作(当前为官方案例请求) 实操1&…

电脑找回彻底删除文件?四个实测效果的方法【一键找回】

电脑数据删除了还能恢复吗?可以的,只要我们及时撤销上一步删除操作,还是有几率找回彻底删除文件。 当我们的电脑文件被彻底删除后,尽管恢复的成功率可能受到多种因素的影响,但仍有几种方法可以尝试找回这些文件。本文整…

c向c++的过渡

目录 1.不同版本的hello word! 2.namespace和::域作用限定符以及using 2.1 namespace 2.2:: 2.3using用于展开域 3.C输入和输出 4.缺省参数 5.重载 6.引用 1.不同版本的hello word! 还记得第一次写C语…

手写简单模拟mvc

目录结构: 两个注解类: Controller: package com.heaboy.annotation;import java.lang.annotation.*;/*** 注解没有功能只是简单标记* .RUNTIME 运行时还能看到* .CLASS 类里面还有,构建对象久没来了,这个说明…

Java信号量semaphore的原理与使用方法

Semaphore的基本概念 在Java中,Semaphore是位于java.util.concurrent包下的一个类。它的核心就是维护了一个许可集。简单来说,就是有一定数量的许可,线程需要先获取到许可,才能执行,执行完毕后再释放许可。 那么&…

Django 新增数据 create()方法

1,添加模型 Test/app11/models.py from django.db import modelsclass Book(models.Model):title models.CharField(max_length100)author models.CharField(max_length100)publication_date models.DateField()price models.DecimalField(max_digits5, decim…