【我与Java的成长记】之this引用和构造方法的使用详解

在这里插入图片描述

系列文章目录

能看懂文字就能明白系列
C语言笔记传送门
🌟 个人主页:古德猫宁-

🌈 信念如阳光,照亮前行的每一步


文章目录

  • 系列文章目录
    • 🌈 *信念如阳光,照亮前行的每一步*
  • 前言
  • 一、this的使用
    • this引用的特性
  • 二、对象的构造和初始化
    • 成员变量和局部变量之间的差别
  • 三、如何初始化对象
    • 就地初始化
    • 通过构造方法初始化
      • 构造方法的特性
      • 构造方法的调用
  • 四、默认初始化


前言

本节目标:掌握this引用,构造方法的定义及其使用

本节重点:都是重点


一、this的使用

先看一个例子:

public class Date {public int year;public int month;public int day;public void setDay(int y, int m, int d){year = y;month = m;day = d;}public void printDate(){System.out.println(year + "/" + month + "/" + day);}public static void main(String[] args) {
// 构造三个日期类型的对象 d1 d2 d3Date d1 = new Date();Date d2 = new Date();Date d3 = new Date();
// 对d1,d2,d3的日期设置d1.setDay(2020,9,15);d2.setDay(2020,9,16);d3.setDay(2020,9,17);
// 打印日期中的内容d1.printDate();d2.printDate();d3.printDate();}
}

以上代码定义了一个日期类,然后main方法中创建了三个对象,并通过Date类中的成员方法对对象进行设置和打印,代码整体逻辑非常简单,应该没有任何问题。

但是细思之下有以下两个疑问:

  1. 形参名不小心与成员变量相同:
public void setDay(int year, int month, int day){
year = year;
month = month;
day = day;
}

这样写的话我们可能就有这些疑问了:那函数体中到底是谁给谁赋值?成员变量给成员变量?参数给参数?参数给成员变量?成员变量参数?估计自己都搞不清楚了。

  1. 三个对象都在调用setDate和printDate函数,但是这两个函数中没有任何任何有关对象的说明,setDate和printDate函数如何知道打印的是哪个对象的数据呢?
    在这里插入图片描述
    接下来有请 this登场
    this引用指向当前对象(成员方法运行时调用该成员方法的对象),在成员方法中所有成员变量的操作,都是通过该引用去访问。只不过所有的操作对用户是透明的,即用户不需要来传递,编译器自动完成,在后面要习惯使用this。
public class Date {
public int year;
public int month;
public int day;
public void setDay(int year, int month, int day){
this.year = year;
this.month = month;
this.day = day;
}
public void printDate(){
System.out.println(this.year + "/" + this.month + "/" + this.day);
}
}
public static void main(String[] args) {
Date d = new Date();
d.setDay(2023,12,28);
d.printDate();
}

注意:this引用的是调用成员方法的对象
在这里插入图片描述

this引用的特性

  1. this的类型:对应类类型引用,即哪个对象调用就是哪个对象的引用类型
  2. this只能在成员方法中使用
  3. 在成员方法中,this只能引用当前对象,不能再引用其他对象
  4. this是成员方法第一个隐藏的参数,编译器会自动传递,在成员方法执行时,编译器会负责将调用成员方法对象的引用传递给该成员,this来负责接收(如上图所示)

二、对象的构造和初始化

成员变量和局部变量之间的差别

在Java方法内部定义一个局部变量时,局部变量必须初始化(局部变量是声明在方法中的),否则会编译失败(C语言则可以)

例如:
在这里插入图片描述
对于上述的代码,你可以声明没有值的a,但如果想要使用时,编译器就会报错,而想要上面的代码编译通过,只需要给变量a初始化即可

如图:
在这里插入图片描述

而对于成员变量,那可就不一样了,在未初始化成员变量的时候,编译器仍然可以编译运行(注意:成员变量是声明在类内而不是方法中)
在这里插入图片描述
这是为什么呢?后面会介绍哒

三、如何初始化对象

那到底如何初始化对象呢,在Java中,初始化对象的方法有很多种,且听小弟慢慢道来

就地初始化

顾名思义,在声明变量的时候就赋予变量的值,这跟初始化局部变量一样(在实际中,就地初始化其实比较少,除非有特殊业务需求,比如任何一次对象的实例化之后,都期望这个对象叫dada,年龄为20)
在这里插入图片描述

当然我们也可以借助方法来帮助我们完成初始化
在这里插入图片描述
在这里插入图片描述

通过构造方法初始化

构造方法(也称构造器)是一个特殊的成员方法,名字必须与类名相同,在创建对象时,由编译器自动调用,并且在整个对象的生命周期只调用一次(构造方法也是定义在类内)

如图是一个带两个参数的构造方法:
在这里插入图片描述
如图是一个不带参数的构造方法:
在这里插入图片描述
上述的两个构造方法,名字相同,参数列表不同,因此构成了方法重载。

特别注意的是:构造方法的作用就是对对象中的成员进行初始化,并不负责给对象开辟空间。

构造方法的特性

  1. 名字必须和类名相同
  2. 没有返回值类型,设置为void也不行
  3. 创建对象时由编译器自动调用,并且在对象的生命周期内只调用一次
  4. 构造方法可以重载(用户可以根据自己的需求提供不同参数的构造方法)

重点:
如果我们没有自己定义任何一个构造方法,编译器会生成一份默认的构造方法,生成的默认构造方法一定是无参的。

它长这样:
在这里插入图片描述
但是!!!!!!!
如果我们一旦写了任何一个构造方法的时候,Java就不会提供这个默认的构造方法了(救急不救穷)什么意思呢?
在这里插入图片描述
在上面的代码中,我们自己定义了一个构造方法,那么Java就不会提供一个无参的构造方法了,我们需要把参数传递给构造方法才不会报错

如图:
在这里插入图片描述

构造方法的调用

那在程序中,这些构造方法是什么时候被调用的呢?

我们用代码来检验一下
在这里插入图片描述
如图所示,只有在实例化对象的时候才被调用且在整个对象的生命周期内只调用一次。

在构造方法中,可以通过this调用其他构造方法来简化代码(注意是在构造方法中才可以)
在这里插入图片描述
在上面的代码中,可以在无参数构造方法中通过this调用带有两个参数的构造方法给成员变量初始值,特别注意的是,this(“zhangsan”,18)必须是构造 方法中的第一条语句,否则编译器会报错。

如图所示:
在这里插入图片描述

四、默认初始化

在开头我们讲述了局部变量和成员变量的差别,那为什么局部变量在使用时必须要初始化,而成员变量可以不用呢?
要搞清楚这个情况,就需要知道 new 关键字背后所发生的一些事情:

在程序层面只是简单的一条语句,在JVM层面需要做好多事情,下面简单介绍下:

  1. 检测对象对应的类是否加载了,如果没有加载则加载
  2. 为对象分配内存空间
  3. 处理并发安全问题,比如:多个线程同时申请对象,JVM要保证给对象分配的空间不冲突
  4. 初始化所分配的空间,即:对象空间被申请之后,对象中包含的成员已经设置好了初始值,比如:
数据类型默认值
byte0
char‘\u0000’
short0
int0
long0L
booleanfalse
float0.0f
double0.0
referencenull

  1. 设置对象头信息(关于对象内存模型后面会介绍)
  2. 调用构造方法,给对象中各个成员赋值

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

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

相关文章

Elasticsearch 查询命令执行时,如何通过词项索引、词项字典、倒排表定位文档逻辑介绍

这里不涉及到源码,只是根据网上的一些文章总结一下,目前不需要细究,只需要知道大概就好,除非你的工作是二次开发ES 一、​Term Index(词项索引)1、FSM(Finite State Machine)有限状态机2、FSA(F…

力扣刷题记录(20)LeetCode:198、213、337

198. 打家劫舍 我们从第一个开始分析: dp[i]:i表示索引,dp表示当前索引可以拿到的最高金额 索引为0时,可以拿到的最高金额为1; 索引为1时,可以拿到的最高金额就是在索引[0,1]之间取,为2 索引为2时&…

雷军的最后一战,就这?

作者 | 魏启扬 来源 | 洞见新研社 2021年3月30日,小米官宣进军电动汽车赛道后的1003天,小米汽车亮相了。 由于是雷军“人生中最后一次重大的创业项目”,押上了雷军“人生所有积累的战绩和声誉”,小米对于造车极为重视&#xff…

性能手机新标杆,一加 Ace 3 发布会定档 1 月 4 日

12 月 27 日,一加宣布将于 1 月 4 日发布新品一加 Ace 3。一加 Ace 系列秉持「产品力优先」理念,从一加 Ace 2、一加 Ace 2V 到一加 Ace 2 Pro,款款都是现象级爆品,得到了广大用户的认可与支持。作为一加 2024 开年之作&#xff0…

【没有哪个港口是永远的停留~论文解读】Both Style and Fog Matter

Both Style and Fog Matter 原文:https://arxiv.org/pdf/2112.00484.pdf 解决问题:大雾、下雨、下雪天模糊场景 其他人做法: 1-去雾算法,人工干扰 2-合成的雾图像,不像真实的雾图像那样真实,也会扩大清…

12.27_黑马数据结构与算法笔记Java(补1)

目录 266 活动选择问题 分析 267 活动选择问题 贪心 268 分数背包问题 贪心 269 0-1 背包问题 贪心 270 斐波那契 动态规划 271 斐波那契 动态规划 降维 272 Bellman Ford 动态规划 分析 273 Bellman Ford 动态规划 实现1 274 Bellman Ford 动态规划 实现2 275 Leetco…

(12)Linux 常见的三种进程状态

💭 前言:本章我们专门讲解进程的状态。我们先学习具体的 Linux 系统状态,再去介绍 OS 学科面对的概念如何理解 —— 运行态、终止态、阻塞态以及挂起态。 进程状态(Process Status) 什么是进程状态? 进程…

C语言—每日选择题—Day64

前言 两天没更新了,作者在复习期末考试,更新一波,祝大家都能顺利通过期末考试!!! 指针相关博客 打响指针的第一枪:指针家族-CSDN博客 深入理解:指针变量的解引用 与 加法运算-CSDN博…

存储:双磁盘RAID0磁盘阵列搭建

磁盘介绍 固态磁盘分为SATA口和PCIE口,SATA单盘实测最高550MB/s, PCIE 4.0单盘写入实测最高2.2GB/s。以上均为缓内速度。 SATA口和PCIE口速度对比 准备工作 准备同型号的两个固态磁盘(不同型号的磁盘组raid会以较低的速度和空间的raid为主…

JavaWeb——监听器Listener 过滤器Filter——韩顺平学习笔记

文章目录 JavaWeb 三大组件之监听器 ListenerListenerJavaWeb 的监听器ServletContextListener 监听器ServletContextAttributeListener 监听器其它监听器-使用较少HttpSessionListener 监听器HttpSessionAttributeListener 监听器ServletRequestListener 监听器ServletRequest…

idea中终端Terminal页面输入命令git log后如何退出

1、idea中Terminal输入命令git log后如何退出? 2、解决 输入q键会自动退出git log命令

反转链表算法及优化(leetcode第206题)

题目描述: 给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。示例 1: 输入:head [1,2,3,4,5] 输出:[5,4,3,2,1] 示例 2: 输入:head [1,2] 输出:[2,1] 示例…

Python 爬虫 小案例 之 快手下载视频

前言 大家早好、午好、晚好吖 ❤ ~欢迎光临本文章 如果有什么疑惑/资料需要的可以点击文章末尾名片领取源码 知识点: 动态数据抓包 requests发送请求开发环境: python 3.8 运行代码 pycharm 2022.3 辅助敲代码 requests pip insta…

vue3-富文本编辑器(vue-quill)

官网&#xff1a;VueQuill | Rich Text Editor Component for Vue 3 安装 pnpm add vueup/vue-quilllatest 使用 局部使用 先导包 import { QuillEditor } from vueup/vue-quill import vueup/vue-quill/dist/vue-quill.snow.css; 再使用 <QuillEditor theme"snow…

最新AI系统ChatGPT网站H5系统源码,支持Midjourney绘画,GPT语音对话+ChatFile文档对话总结+DALL-E3文生图

一、前言 SparkAi创作系统是基于ChatGPT进行开发的Ai智能问答系统和Midjourney绘画系统&#xff0c;支持OpenAI-GPT全模型国内AI全模型。本期针对源码系统整体测试下来非常完美&#xff0c;可以说SparkAi是目前国内一款的ChatGPT对接OpenAI软件系统。那么如何搭建部署AI创作Ch…

python 实现粒子群算法(带绘制)

本文章用python实现了粒子群算法&#xff0c; 标准PSO的算法流程如下&#xff1a; 初始化一群微粒&#xff08;群体规模为m&#xff09;&#xff0c;包括随机的位置和速度&#xff1b;评价每个微粒的适应度&#xff1b;对每个微粒&#xff0c;将它的适应值和它经历过的最好位…

C++day2作业

把课上strcut的练习&#xff0c;尝试着改成class #include <iostream>using namespace std; class Stu { private:int age;string sex;int hign; public:int soce;void get_information();void set_information(); }; void Stu::set_information() {static Stu s1;cout …

【CSAPP】探究BombLab奥秘:Phase_1的解密与实战

&#x1f4cb; 前言 ​&#x1f308;个人主页&#xff1a;Sarapines Programmer&#x1f525; 系列专栏&#xff1a;《斯坦福大学之CSAPP》⏰诗赋清音&#xff1a;桃花灼灼春风暖&#xff0c;心随乐曲扬徐徐。 苦尽甘来梦未阑&#xff0c;岁月长河任舟游。 ​ &#x1f389;欢迎…

积极拥抱信创,思迈特软件与麒麟软件NeoCertify完成认证

近日&#xff0c;思迈特软件与麒麟软件有限公司进行了联合测试&#xff0c;并顺利完成产品兼容性测试。经评测&#xff0c;思迈特软件一站式大数据分析平台&#xff08;Smartbi Insight V11&#xff09;与银河麒麟高级服务器操作系统&#xff08;飞腾版&#xff09;V10、&#…

ubuntu 在线安装 python3 pip

ubuntu 在线安装 python3 pip 安装 python3 pip sudo apt -y install python3 python3-pip升级 pip python3 -m pip install --upgrade pip