当前位置: 首页 > news >正文

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() 的调用必须是构造器第一条语句

相关文章:

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

一、什么是构造器 构造器(Constructor)是Java类的一种特殊方法,用于初始化对象的状态。构造器在创建对象时被调用,可以对对象的成员变量进行初始化。 我之前的文章《Java——类和对象-CSDN博客》中也提到了构造器。 二、构造器…...

MySQL-连接查询

049-内连接之等值连接 案例:查询每个员工所在的部门名称,要求显示员工名、部门名。 select e.ename, d.dname from emp e inner join dept d on e.deptnod.deptno;注意:inner可以省略 select e.ename, d.dname from emp e join dept d on…...

适合小白学习的项目1832javaERP管理系统之仓库采购管理Myeclipse开发mysql数据库servlet结构java编程计算机网页项目

一、源码特点 java erp管理系统之仓库采购管理是一套完善的web设计系统,对理解JSP java编程开发语言有帮助采用了serlvet设计,系统具有完整的源代码和数据库,系统采用web模式,系统主要采用B/S模式开发。开发环境为TOMCAT7.0,Mye…...

分布式技术导论 — 探索分析从起源到现今的巅峰之旅(分布式技术)

分析探索从起源到现今的巅峰之旅 背景介绍数据可伸缩性案例 计算可伸缩性案例 代价和权衡分布式的代价分布式的权衡权衡策略 分布式技术方向数据系统运算系统 分布式数据系统Partition(分区)Round-Robin(轮询)局限性 Range&#x…...

基于Python+OpenCV+SVM车牌识别系统(GUI界面)【W3】

简介: 随着交通管理的日益复杂化和智能化需求的增加,车牌识别系统在安防、智慧交通管理等领域中扮演着重要角色。传统的车牌识别系统主要基于图像处理和模式识别技术,随着计算机视觉技术的发展,基于Python、OpenCV和机器学习算法的…...

ansible.cfg forks参数

在Ansible的配置文件ansible.cfg中,forks参数是一个非常关键的设置,它控制了Ansible执行任务时的并发连接数,直接影响到Ansible执行 playbook 或 ad-hoc 命令时的速度和效率。 意义与作用 并发控制:当你使用Ansible来管理多台主…...

Web前端写随机抽奖:技术与创意的碰撞

Web前端写随机抽奖:技术与创意的碰撞 在Web前端的世界里,随机抽奖功能不仅是一种常见的交互元素,更是技术与创意的完美结合。下面,我们将从四个方面、五个方面、六个方面和七个方面,深入探讨Web前端实现随机抽奖的技术…...

Centos系统yum安装mysql数据库

安装之前需要将系统自带的mariadb-libs软件包删除。 检查是否存在mariadb-libs包。 yum list installed|grep mariadb-libs 删除mariadb-libs包 yum -y remove mariadb-libs 声明: 系统:CentOS-7-x86_64-DVD-2009 安装为最小化安装,没…...

使用Selenium进行Web自动化:详细操作指南

使用Selenium进行Web自动化:详细操作指南 引言 Selenium是一个广泛使用的开源工具,用于自动化Web浏览器的操作。无论你是进行自动化测试,还是需要抓取网页数据,Selenium都是一个非常有用的工具。本文将详细介绍Selenium的一些常见用法,包括输入框设置值、文件上传、单选…...

手机照片免费数据恢复软件EasyRecovery2024免费版下载

大家好!今天我要给大家推荐一款非常棒的软件——EasyRecovery。相信大家都知道,电脑中的重要文件一旦丢失,对我们的工作和学习都会产生很大的影响。 而EasyRecovery软件就是专门解决这个问题的利器!它能够帮助我们快速、有效地恢…...

【工具】新手如何正确使用Pycharm?

1. 什么是JetBrains Toolbox JetBrains Toolbox是一个管理工具,用于安装、更新和管理JetBrains开发工具的所有版本。它可以简化多个IDE的管理,并确保你总是使用最新版本的软件。 2. 安装JetBrains Toolbox 步骤1:下载Toolbox 访问JetBrai…...

【JavaEE精炼宝库】多线程(6)线程池

目录 一、线程池的概念及优势 1.1 线程池的概念: 1.2 线程池的优势: 二、工厂模式 三、标准库中的线程池 3.1 标准库线程池参数解释: 3.1.1 corePoolSize | maximumPoolSize: 3.1.2 keepAliveTime | unit: 3.1…...

数据仓库和数据库的区别

数据仓库和数据库在许多方面存在显著的区别,主要体现在数据的用途、架构、设计原则和性能优化上。以下是两者之间的详细区别: 1. 目的和用途 数据库(Database): 主要用途:用于日常业务操作和事务处理。数据…...

芯片验证分享7 —— 代码审查1

大家好,我是谷公子,前几节课给大家分享了如何设计激励,今天我们来如何进行代码审查。 之前讨论的是基于计算机的验证技术,现在讨论非基于计算机的验证过程(即“人工验证”,或代码审查)。代码审查在查找错误方面非常有…...

Shell脚本从入门到实战

一、概述 shell 是一个命令行解释器,它接受应用程序、用户命令,然后调用操作系统内核。 shell 还是一个功能强大编程语言,易调试,易编写,灵活性强。 二、mac 怎么重启docker 1.如何重启 Docker on Mac 在 macOS 上…...

使用 python 将 Markdown 文件转换为 ppt演示文稿

在这篇博客中,我们将展示如何使用 wxPython 创建一个简单的图形用户界面 (GUI),以将 Markdown 文件转换为 PowerPoint 演示文稿。我们将利用 markdown2 模块将 Markdown 转换为 HTML,并使用 python-pptx 模块将 HTML 内容转换为 PowerPoint 幻…...

Arnoldi Iteration 思考

文章目录 1. 投影平面2. Arnoldi Iteration3. python 代码 1. 投影平面 假设我们有一个向量q,我们需要关于向量q,构建一个投影平面P,使得给定任何向量v,可以通过公式 p P v pPv pPv,快速得到向量v在投影平面P上的投影向量p. 计算向量内积,…...

【Kafka】SpringBoot整合Kafka详细介绍及代码示例

Kafka介绍 Apache Kafka是一个分布式流处理平台。它最初由LinkedIn开发,后来成为Apache软件基金会的一部分,并在开源社区中得到了广泛应用。Kafka的核心概念包括Producer、Consumer、Broker、Topic、Partition和Offset。 Producer:生产者&a…...

C++ 质数因子分解

描述 功能:输入一个正整数,按照从小到大的顺序输出它的所有质因子(重复的也要列举)(如180的质因子为2 2 3 3 5 ) 输入描述: 输入一个整数 输出描述: 按照从小到大的顺序输出它的所有质数的…...

laravel版本≥ 8.1

laravel10 php ≥ 8.1 且 ≤ 8.3&#xff1f; 8.1 < php < 8.3PHP版本要求在 8.1 到 8.3 之间&#xff0c;包括这两个版本。具体来说&#xff1a;"≥ 8.1" 表示 PHP 的版本至少是 8.1&#xff0c;也就是说 8.1 及以上的版本都可以。 "≤ 8.3" 表示 P…...

【iOS】MRC下的单例模式批量创建单例

单例模式的介绍和ARC下的单例请见这篇&#xff1a;【iOS】单例模式 目录 关闭ARC环境MRC下的单例ARC下的单例批量创建单例Demo 关闭ARC环境 首先关闭ARC环境&#xff0c;即打开MRC&#xff1a; 或是指定某特定目标文件为非ARC环境&#xff1a; 双击某个类文件&#xff0c;指定…...

计算机网络期末复习

今天考专四&#xff0c;环境都蛮好的&#xff0c;试卷也很新&#xff0c;老师人也不错&#xff0c;明年再来。 又到期末考试咯&#xff0c;大家复习没有&#xff1f;还没复习啊&#xff1f;还不复&#xff1f;&#xff1f;&#xff1f;&#xff1f; 目录 第一章 1-02 试简述…...

python写一个获取竞品信息报告

要编写一个获取竞品信息报告的Python程序&#xff0c;首先需要明确您想要获取的竞品信息以及数据来源。在这个示例中&#xff0c;我将展示如何从网页提取竞品信息&#xff0c;并编写一个简单的报告。 假设您想要获取以下竞品信息&#xff1a; 1. 产品名称 2. 产品价格 3. 产品特…...

一文彻底理解机器学习 ROC-AUC 指标

在机器学习和数据科学的江湖中&#xff0c;评估模型的好坏是非常关键的一环。而 ROC&#xff08;Receiver Operating Characteristic&#xff09;曲线和 AUC&#xff08;Area Under Curve&#xff09;正是评估分类模型性能的重要工具。 这个知识点在面试中也很频繁的出现。尽管…...

【二】【动态规划NEW】91. 解码方法,62. 不同路径,63. 不同路径 II

91. 解码方法 一条包含字母 A-Z 的消息通过以下映射进行了 编码 &#xff1a; ‘A’ -> “1” ‘B’ -> “2” … ‘Z’ -> “26” 要 解码 已编码的消息&#xff0c;所有数字必须基于上述映射的方法&#xff0c;反向映射回字母&#xff08;可能有多种方法&#xff…...

Python闯LeetCode--第3题:无重复字符的最长子串

Problem: 3. 无重复字符的最长子串 文章目录 思路解题方法复杂度Code 思路 一上来马上想到两层for循环暴力枚举&#xff0c;但是又立马想到复杂度是 O ( n 2 ) O(n^2) O(n2)&#xff0c;思考了一下能否有更优解&#xff0c;于是想到用头尾两个指针来指定滑动窗口&#xff08;主…...

HTML DOM 对象

HTML DOM 对象 1. 概述 HTML DOM(文档对象模型)是一个跨平台和语言独立的接口,它允许程序和脚本动态地访问和更新文档的内容、结构和样式。在HTML DOM中,文档被表示为节点树,其中每个节点代表文档中的一个部分,例如元素、文本或属性。HTML DOM对象是构成这个节点树的基…...

如何解决 BeautifulSoup 安装问题:从 BeautifulSoup 3 到 BeautifulSoup 4

在使用 Python 的过程中&#xff0c;解析 HTML 和 XML 数据是一项常见任务。BeautifulSoup 是一个非常流行的解析库。然而&#xff0c;最近在安装 BeautifulSoup 时&#xff0c;遇到了一些问题。本文将介绍如何解决这些问题&#xff0c;并成功安装 BeautifulSoup 4。 问题描述 …...

原型模式--深复制/浅复制

原型模式用于克隆复杂对象&#xff0c;由于new一个实例对象会消耗大部分时间&#xff0c;所以原型模式可以节约大量时间 1 public class Sheep implements Cloneable{2 private String name;3 private Date birth;4 public Sheep(String name, Date birth) {5 …...

C# TextBox模糊查询及输入提示

在程序中&#xff0c;我们经常会遇到文本框中不知道输入什么内容&#xff0c;这时我们可以在文本框中显示提示词提示用户&#xff1b;或者需要查询某个内容却记不清完整信息&#xff0c;通常可以通过文本框列出与输入词相匹配的信息&#xff0c;帮助用户快速索引信息。 文本框…...

达州住房和城乡建设部网站/杭州网站排名提升

2019独角兽企业重金招聘Python工程师标准>>> grep -i 默认情况下&#xff0c;grep命令对大小写是敏感的&#xff0c;-i 选项则相反。转载于:https://my.oschina.net/doctor2014/blog/412489...

上传网站视频要怎么做才清楚/公司地址怎么弄在百度上显示

在项目中往往将一些配置信息放到配置文件中&#xff0c;这样在不同的运行环境中&#xff0c;只需修改配置文件即可。 以下介绍两种通过第三方包获取配置文件的方式 一&#xff0e;通过gopkg.in/ini.v1 go get gopkg.in/ini.v11. 配置文件test.conf ;[mqtt] mqtt_hostname 12…...

wordpress页面显示返回json/福州seo公司排名

因为是刚开始使用框架&#xff0c;连接数据库报了一堆错&#xff0c;所以上网搜了很多的相关教程&#xff0c;还是没解决问题&#xff0c;后来才发现是两个很简单的问题&#xff1a;一个是连接数据库的url的端口是3306&#xff0c;和tomcat的8080弄混了&#xff0c;一直写的808…...

绵阳的网站建设公司/名风seo软件

2019独角兽企业重金招聘Python工程师标准>>> 手机 APP 运行,不同页面间传值是必不可少,传值的方式有很多(方法传值,属性传值,代理传值,单例传值) ,这里主要总结下属性传值和代理传值. 属性传值:属性传值是最简单,也是最常见的一种传值方式,但其具有局限性(一般用于将…...

英语培训建设网站方案/石家庄网络seo推广

原文&#xff1a;How To Make A UIViewController Transition Animation Like in the Ping App 作者&#xff1a;Luke Parham 译者&#xff1a;kmyhy 更新说明&#xff1a;本教程由 Luke Parhm 更新至 Xcode 9/Swift 4。原文作者是 Rounak Jain。 不久前&#xff0c;匿名社交…...

白玉网站建设/公司做网站一般多少钱

目录 1.foreach元素的属性 2.collection属性值的三种情况 3.代码示例 3.1 collection属性值为List(Array等同): 3.2 collection属性值类型为Map: 1.foreach元素的属性 collection: foreach的对象,作为入参,对象为list、array时&#xff0c;collection属性值分别默认用&quo…...