Java——构造器(构造方法)和 this

一、什么是构造器

构造器(Constructor)是Java类的一种特殊方法,用于初始化对象的状态。构造器在创建对象时被调用,可以对对象的成员变量进行初始化。

我之前的文章《Java——类和对象-CSDN博客》中也提到了构造器。

二、构造器详细介绍

1、引入

我们之前在实例化一个类时,对创建的对象的属性初始化都是依靠一个个访问对象的属性然后一个个赋值的,这样实在太麻烦。

public class Test {public static void main(String[] args) {Person person = new Person();person.name = "张三";person.age = 19;}
}class Person {Sring name;int age;//...
}

这时,我们就可以使用构造器,构造器实际上是在创建对象时自动被调用的。

public class Test {public static void main(String[] args) {Person person = new Person("张三", 19);}
}class Person {String name;int age;//构造器public Person(String name, int age) {this.name = name;this.age = age;}
}

这样我们就能再创建对象时就直接将对象的属性初始化好了。

2、构造器介绍

1)基本语法

构造器的基本语法是:

[修饰符] 类名(参数列表) {/...
}

2)特点

  1. 名称与类名相同:构造器的名称必须与类名完全一致。
  2. 没有返回类型:构造器没有返回类型(连 void 都不能写)。
  3. 自动调用:构造器在使用new关键字创建对象时自动调用。
  4. 隐式构造器:如果类中没有定义任何构造器,Java编译器会自动提供一个无参的默认构造器。但是一旦用户自定义了自己的构造器,这个默认构造器就会被覆盖,就不会存在了。这个构造器就长这样:
    类名() {}
  5. 访问修饰符:构造器的修饰符可以是public,private,protected,默认(什么都不写)。

3、构造器重载

构造器像一般方法一样,也可以重载。

public class Test {public static void main(String[] args) {Person person1 = new Person();//使用无参的构造器初始化Person person2 = new Person("张三");//使用一个名字参数的构造器初始化Person person3 = new Person("李四", 19);//使用两个参数的构造器初始化}
}class Person {String name;int age;//无参构造器public Person() {this.name = "无名";this.age = 18;}//一个名字参数的构造器public Person(String name) {this.name = name;this.age = 18;}//两个参数的构造器public Person(String name, int age) {this.name = name;this.age = age;}
}

重载的规则与一般方法的规则也是一致的。

4、构造器使用示例

public class Test {public static void main(String[] args) {Cat cat = new Cat("小喵", 3);}
}class Cat {String name;int age;//构造器public Cat(String name, int age) {this.name = name;this.age = age;}
}

使用构造器初始化 cat 对象的两个属性。

5、补充细节

1)构造器只完成对对象的初始化

构造器只完成对象的初始化,不会创建对象。

2)查看默认的构造器

上面我们说到,如果用户没有显示自定义构造器,Java编译器会自动提供一个无参的默认构造器。我们可以使用 javap 反编译查看这个构造器:

我们以下列代码为例,这里定义一个类,里面没有任何内容:

class Cat {}

然后我们使用 javac 指令进行编译,

然后使用 javap 反编译字节码文件,得到的内容如下:

我们可以看到这里是对应的一个方法的声明。

三、创建对象的同时使用构造器的具体图解

下面我们对创建对象的同时使用构造器初始化对象的属性的具体机制进行详细介绍,以以下代码为例:

public class Test {public static void main(String[] args) {Person person3 = new Person("李四", 19);//使用两个参数的构造器初始化}
}class Person {String name;int age;//构造器public Person(String name, int age) {this.name = name;this.age = age;}
}

当执行主方法中的第一句时,会加载 Person 类,然后再堆区创建 person3 这个对象,然后这个对象的属性被默认初始化为类型默认值:

然后调用构造方法将这个 person3 对象初始化。

如果在类中对某个属性有过显式初始化,例如下面:

public class Test {public static void main(String[] args) {Person person3 = new Person("李四", 19);//使用两个参数的构造器初始化}
}class Person {String name;int age = 18;//构造器public Person(String name, int age) {this.name = name;this.age = age;}
}

这里对于 age 属性就有显式初始化,接下来的初始化顺序是:

四、this 介绍

1、this 简要介绍

this 是一个指向当前对象的引用。在实例方法或构造方法中使用 this 时,它指向调用该方法或构造方法的对象实例。

2、隐式使用 this

在实例方法中,即使不显式使用 this,JVM 也会在幕后使用 this 来引用当前对象。例如,访问实例变量 num 实际上是 this.num。就像下面的代码:

class Person {String name;int age;public void speak() {System.out.println(name + "说:...");//这里的name就是this.name}
}

3、this 的实际内部工作机制

当实例方法被调用时,JVM 会传递一个隐藏参数给该方法,这个隐藏参数就是对调用该方法的对象的引用,也就是 this

五、this 使用

1、用于区分实例变量和局部变量

在方法或构造器中,如果局部变量和实例变量同名,那么局部变量会隐藏实例变量。此时可以使用 this 关键字来引用实例变量。

public class MyClass {private int num;public MyClass(int num) {this.num = num;  // this.num 指的是实例变量,而 num 是构造器的参数}public void setNum(int num) {this.num = num;  // this.num 指的是实例变量,而 num 是方法参数}public int getNum() {//return num;    //就相当于return this.num; 这里会隐式使用thisreturn this.num;  // this.num 指的是实例变量}
}

2、访问对象的属性

public class Test {public static void main(String[] args) {Person person = new Person("张三", 19);person.info();//显示信息}
}class Person {String name;int age;//构造器public Person(String name, int age) {this.name = name;this.age = age;}public void info() {System.out.println("名字:" + this.name + "\n年龄:" + this.age);}
}

运行结果:

这里的通过 this 访问到对象的 name 和 age 属性。

3、调用当前对象的方法

可以使用 this 关键字来调用当前对象的方法,尤其是在需要明确是当前实例的方法时。

class Person {String name;int age;//说话public void speak(String words) {System.out.println(this.name + "说:“" + words + "”");}//打招呼public void greet() {this.speak("你好!");//调用该对象的说话方法}
}

4、调用当前对象的构造器

在构造器内部,可以使用 this() 调用当前类的其他构造器。这个语法只能在构造器中使用。

class Person {String name;int age;//一个名字参数构造器public Person(String name) {this.name = name;}//两个参数的构造器public Person(String name, int age) {this(name);this.age = age;}
}

如果我们要使用 this() 语句在一个构造器中调用其他构造器,那么 this() 这条语句必须是这个构造器的第一条语句,就像上面这样。

也就是说对 this() 的调用必须是构造器第一条语句

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

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

相关文章

【面试题】MySQL常见面试题总结

备战实习,会定期给大家整理常考的面试题,大家一起加油! 🎯 系列文章目录 【面试题】面试题分享之JVM篇【面试题】面试题分享之Java并发篇【面试题】面试题分享之Java集合篇(三) 注意:文章若有错…

AI办公自动化:批量在多个Word文档中插入对应图片

工作任务:文件夹中有多个word文档和word文档名称一致的图片,要把这些图片都插入到word文档中 在chatpgt中输入提示词: 你是一个Python编程专家,写一个Python脚本,具体步骤如下: 打开文件夹:F:…

蓝队-溯源技巧

溯源技巧 大致思想 通常情况下,接到溯源任务时,获得的信息如下 攻击时间 攻击 IP 预警平台 攻击类型 恶意文件 受攻击域名/IP其中攻击 IP、攻击类型、恶意文件、攻击详情是溯源入手的点。 通过攻击类型分析攻击详情的请求包,看有没有攻击者…

零基础入门学用Arduino 第三部分(二)

重要的内容写在前面: 该系列是以up主太极创客的零基础入门学用Arduino教程为基础制作的学习笔记。个人把这个教程学完之后,整体感觉是很好的,如果有条件的可以先学习一些相关课程,学起来会更加轻松,相关课程有数字电路…

8、项目目录结构创建

项目目录结构创建 8.1 三层架构 在spring-boot 的web项目中大都是按照这个思路来的: controller层 —> service层(serviceImpl实现service接口)—> mapper层—> mapper.xml文件 创建目录 commen:存放公共代码的 config:存放配置代码的 controller:后端控制器,…

长连接的钟表程序

实验要求 实现1个钟表程序(服务),多个用户可以从该程序获得时间并在本地显示,用户也可以修改时间。 (1)用户程序可以在计算机上运行,也可以在手机上运行; (2&#xff…

了解统计学中不同类型的分布

目录 一、说明 二、均匀分布: 三、机器学习和数据科学中的均匀分布示例: 3.1 对数正态分布: 3.2 机器学习和数据科学中的对数正态分布示例: 四、 帕累托分布 4.1 什么是幂律? 4.2 机器学习和数据科学中的帕累托分布示例…

怎么找抖音视频素材?在哪里找爆款热门的素材呢?

在短视频时代,拍摄和分享短视频已经成为一种潮流。但是,许多人都会面临一个问题,那就是——视频素材从哪里来?今天,我将为大家介绍几个优质的网站,让你的视频素材不再愁。 蛙学府:https://www.…

如何连接达梦数据库?

连接达梦数据库(DM Database)可以通过多种方式进行,包括使用 JDBC(Java Database Connectivity)驱动程序,这是最常见的方式之一。以下是使用 Java 通过 JDBC 连接达梦数据库的详细步骤: 1. 准备…

pve8群晖rr方式安装(编译失败检查网络或磁盘空间error 23:200问题解决)

PVE 篇二:2024年PVE8最新安装使用指南|安装黑群晖|img格式镜像安装_NAS存储_什么值得买 (smzdm.com) 黑群晖 篇五:2023黑群晖最新安装方式|RR新手也可轻松上手_NAS存储_什么值得买 (smzdm.com) 编译引导提示:检查网络或磁盘空间er…

Mybatis动态sql标签

动态SQL标签简介: MyBatis的一个强大的特性之一通常是它的动态SQL能力。如果你有使用JDBC或其他相似框架的经验,你就明白条件地串联SQL字符串在一起是多么的痛苦,确保不能忘了空格或在列表的最后省略逗号。动态SQL可以彻底处理这种痛苦。 Mybatis中实现动态sql的标签有&#x…

重生之 SpringBoot3 入门保姆级学习(24、场景整合 kafka 消息发送服务)

重生之 SpringBoot3 入门保姆级学习(24、场景整合 kafka 消息发送服务) 6.4 消息发送服务 6.4 消息发送服务 访问 kafka-ui (注意这里需要换成你自己的服务器或者虚拟机的 IP 地址,虚拟机可以用局域网 192.168.xxx.xxx 的地址&…

AMD Lisa Su专访:谈与英伟达、Intel竞争 直言Arm不是敌人

AMD CEO Lisa Su(苏姿丰)绝对称得上是芯片届的风云人物,尤其是进入了AI新时代,她的声望达到了十年来最高点。翻看其成长历史,苏姿丰在麻省理工学院获得电气工程博士学位后(在麻省理工学院学习八年半&#x…

sudo 用户切换

切换到centos 用户 sudo -i -u centos 解决centos sudo执行仍旧显示Permission denied 方法一(建议) 暂时切换到root用户 sudo -i然后执行命令即可 方法二 赋给当前用户权限: sudo chmod -R 777 目录路径 sudo chmod 777 文件路径.txt…

element--el-table合计换行显示

el-table合计换行显示 效果图实现1、使用到的参数2、代码演示 效果图 实现 1、使用到的参数 官网链接:element-table 将show-summary设置为true就会在表格尾部展示合计行。默认情况下,对于合计行,第一列不进行数据求合操作,而是…

浪潮信息MUPR自研专利 保障服务器内存运行的可靠性和高效性

在数字化转型的大潮中,服务器作为支撑企业业务运行的核心设备,其稳定性和可靠性显得尤为重要。然而,传统的内存故障预警修复技术往往存在反应滞后、误报率高等问题,难以满足日益增长的数据处理和存储需求。针对这一问题&#xff0…

用CloudCompare软件拟合点云中的圆柱体

用CloudCompare软件拟合点云中的圆柱体 软件下载 点击下面的链接,进入下载页面: 下载页面 然后根据需要选择下载合适的软件版本。 一般选择windows installer版,如图所示: 下载完成后,安装并打开软件。软件的默认语…

LC1020:飞地的数量

题目 给你一个大小为 m x n 的二进制矩阵 grid ,其中 0 表示一个海洋单元格、1 表示一个陆地单元格。 一次 移动 是指从一个陆地单元格走到另一个相邻(上、下、左、右)的陆地单元格或跨过 grid 的边界。 返回网格中 无法 在任意次数的移动…

分布式数据库核心问题和解决方法

当下,由于成本压力以及数据保护的要求,采用国产数据库的呼声越来越高,但是国产数据库数量众多,良莠不齐,没有选择数据库比较靠谱的标准,业内真正懂得数据库的人很少,且为了这块大的蛋糕&#xf…

第十七篇——交叉熵:如何避免制订出与事实相反的计划?

目录 一、背景介绍二、思路&方案三、过程1.思维导图2.文章中经典的句子理解3.学习之后对于投资市场的理解4.通过这篇文章结合我知道的东西我能想到什么? 四、总结五、升华 一、背景介绍 任何事情,都需要我们制订计划执行计划;而制订计划…