JAVA中的隐式参数this
在Java中,`this` 关键字是一个非常重要的隐式参数,它代表当前对象的引用。通过 `this`,你可以访问类中的字段(属性)、方法以及构造函数中的参数(当参数名与字段名相同时,用于区分)。虽然 `this` 本身不是一个参数,但它的行为和作用在很多方面类似于方法调用时传递给方法的参数,尤其是当它在构造函数或方法中被用来引用当前对象时。下面,我将详细介绍 `this` 的用法,并通过代码示例和注释来解释其各个方面。
一、`this` 关键字的基本用法
1. 访问当前类的成员变量:
当局部变量名与成员变量名相同时,可以使用 `this` 关键字来指定成员变量。
2. 调用当前类的其他构造方法:
在构造函数中,`this` 可以用来调用同一个类的其他构造方法。这种调用必须位于构造函数的第一条语句。
3. 返回当前对象的引用:
在某些场景下,`this` 可以作为方法的返回值,返回当前对象的引用。
二、代码示例和注释
2.1 访问当前类的成员变量
public class Person {String name; // 成员变量public Person(String name) {this.name = name; // 使用this来区分成员变量name和参数name}public void setName(String name) {this.name = name; // 同样的,这里也需要使用this来明确是成员变量name}public String getName() {return this.name; // 返回成员变量name的值}public void display() {System.out.println("Name: " + this.name); // 在方法中同样可以使用this}public static void main(String[] args) {Person person = new Person("Alice");person.setName("Bob");person.display(); // 输出: Name: Bob}
}
在上面的例子中,`this.name` 用来访问类中的 `name` 成员变量,以区分与构造方法参数和 `setName` 方法参数同名的局部变量 `name`。
2.2 调用当前类的其他构造方法
public class Circle {double radius;// 默认构造函数public Circle() {this(1.0); // 调用另一个构造函数}// 带参数的构造函数public Circle(double radius) {this.radius = radius;}public static void main(String[] args) {Circle circle1 = new Circle(); // 使用默认构造函数,radius被设置为1.0Circle circle2 = new Circle(5.0); // 使用带参数的构造函数,radius被设置为5.0System.out.println("Circle1 radius: " + circle1.radius); // 输出: Circle1 radius: 1.0System.out.println("Circle2 radius: " + circle2.radius); // 输出: Circle2 radius: 5.0}
}
在这个例子中,`Circle` 类有两个构造函数。一个是没有参数的默认构造函数,它使用 `this(1.0);` 来调用另一个带有 `double` 类型参数的构造函数,并将 `radius` 初始化为 `1.0`。这展示了如何使用 `this` 来调用类中的其他构造方法。
2.3 返回当前对象的引用
public class ChainExample {int value;public ChainExample(int value) {this.value = value;}// 链式调用示例public ChainExample setValue(int value) {this.value = value;return this; // 返回当前对象的引用}public void display() {System.out.println("Value: " + this.value);}public static void main(String[] args) {ChainExample example = new ChainExample(10).setValue(20) // 链式调用setValue方法.setValue(30); // 继续链式调用example.display(); // 输出: Value: 30}
}
在这个例子中,`setValue` 方法在修改 `value` 字段的值后,返回当前对象的引用。这使得能够连续调用多个方法,形成所谓的“链式调用”。这在设置多个属性时非常有用,可以提高代码的可读性和简洁性。
在Java中,`this` 关键字是理解面向对象编程(OOP)概念的关键部分。它在不同的上下文中有着不同的作用,但始终表示当前对象的引用。下面,我将继续介绍 `this` 的一些其他用法和概念。
三、深入理解 `this`
3.1 `this` 在继承中的用法
当子类调用父类的构造方法时,可以使用 `this` 来调用子类的构造方法。这在多态的实现中特别有用。
public class Animal {protected String name;public Animal(String name) {this.name = name;}
}public class Dog extends Animal {public Dog(String name) {// 使用super调用父类构造函数super(name);System.out.println("Dog created.");}
}
在这个例子中,`Dog` 类继承了 `Animal` 类。在 `Dog` 的构造函数中,我们使用 `super(name);` 来调用其父类的构造方法。`super` 实际上是一个隐式参数,它代表父类的引用,这和 `this` 类似。
3.2 `this` 和局部变量
当成员变量和局部变量同名时,`this` 可以用来访问成员变量而不是局部变量。这在方法内部尤为常见:
public class Person {private String name;private int age;public void setInfo(String name, int age) {this.name = name; // 使用 this.name 来区分成员变量和参数this.age = age; // 同上,使用 this.age 来区分成员变量和参数}// ... 其他代码 ... //
}
在上面的例子中,`setInfo` 方法有两个参数 `name` 和 `age`。由于它们与类的成员变量具有相同的名称,因此必须使用 `this` 前缀来确保是更新了正确的成员变量而非局部变量。
3.3 在静态上下文中不能使用 `this` 关键字
由于静态方法是属于类的而不是属于对象的,因此在静态上下文中不能使用 `this` 关键字。如果你尝试在静态上下文中使用 `this`(如静态方法或静态初始化器),你将得到一个编译错误。例如:
public class MyClass {static int x = this.hashCode(); // Error: cannot refer to 'this' in static contextpublic static void main(String[] args) {System.out.println(this); // Error: cannot refer to 'this' in static context}
}
四、总结
`this` 是Java中的一个重要概念,它提供了对当前对象引用的访问权限。通过合理的使用可以简化代码、提高可读性以及实现特定的设计模式等。《深入理解Java虚拟机》一书中对 Java 的各种特性有着深入且全面的讲解,对于想要更深入了解 Java 的读者来说是一本非常值得阅读的书籍。在阅读该书的过程中结合实际编程经验,可以更深刻地理解并掌握 Java 的核心概念和高级特性。
相关文章:
JAVA中的隐式参数this
在Java中,this 关键字是一个非常重要的隐式参数,它代表当前对象的引用。通过 this,你可以访问类中的字段(属性)、方法以及构造函数中的参数(当参数名与字段名相同时,用于区分)。虽然…...
ThreadLocal 使用和详解避坑
在多线程编程中,每个线程都有自己的线程栈和线程本地存储。线程栈用于存储方法调用的信息,而线程本地存储则是每个线程私有的存储空间,用于存储线程的局部变量。ThreadLocal类提供了一种简单的方式来实现线程本地存储,它允许将线程…...
Python中使用类方法的返回值在其他方法中继续调用,return self进行链式调用
文章目录 return self进行链式调用继续思考,以下内容可以不看如果self中没有初始化valueself中定义其他变量,调用类方法外的函数 return self进行链式调用 在Python中,可以使用类方法的返回值在其他方法中继续调用。这通常通过返回类实例&am…...
基于IOT架构的数据采集监控平台!
LP-SCADA数据采集监控平台是蓝鹏测控推出的一款聚焦于工业领域的自动化数据采集监控系统, 助力数字工厂建设的统一监控平台。 为企业提供从下到上的完整的生产信息采集与集成服务,从而为企业综合自动化、工厂数字化及完整的"管控一体化”的解决方案…...
初见scikit-learn之基础教程
初见scikit-learn之基础教程 scikit-learn 基础教程 1. scikit-learn 简介1.1 什么是 scikit-learn?1.2 scikit-learn 的主要功能 2. 安装 scikit-learn2.1 安装方法2.2 验证安装 3. scikit-learn 基本使用3.1 数据加载与预处理3.1.1 加载数据集3.1.2 数据拆分3.1.3…...
基于STM32的嵌入式深度学习系统教程
目录 引言环境准备嵌入式深度学习系统基础代码实现:实现嵌入式深度学习系统 数据采集与预处理深度学习模型训练与优化模型部署与推理实时数据处理与反馈应用场景:智能物联网设备常见问题与解决方案收尾与总结 引言 随着深度学习在各种应用中的广泛采用…...
hive udf去掉map中的一个或者多个key
实现一个hive udf,可以将Map中的某一个或者多个key去掉,这里要继承GenericUDF 这个抽象类,然后Override evaluate这个函数即可,可以把执行这个udf前初始化的一些内容放在initialize方法内,比如参数的判断,函数的返回值类型等等。 代码写好之后,可以用如下方法创建这个函…...
模型量化技术综述:揭示大型语言模型压缩的前沿技术
大型语言模型(LLMs)通常因为体积过大而无法在消费级硬件上运行。这些模型可能包含数十亿个参数,通常需要配备大量显存的GPU来加速推理过程。 因此越来越多的研究致力于通过改进训练、使用适配器等方法来缩小这些模型的体积。在这一领域中&am…...
一文掌握Prompt:万能框架+优化技巧+常用指标
👉目录 1 写在前面 2 Prompt 万能框架 3 框架的细化 4 在框架上增加更多信息(RAG) 5 让大模型更好的思考(CoT) 6 附加技巧 7 优化方式及常用指标 8 写在最后 随着大模型在2023年横空出世,“Prompt 工程” 应…...
Vue 常用组件间通信方式
Vue 常用组件间通信方式 1. 父子组件通信 1.1 Props 父组件通过 props 向子组件传递数据,子组件通过 props 接收数据。 <!-- ParentComponent.vue --> <template><ChildComponent :message"parentMessage"></ChildComponent>…...
NineData云原生智能数据管理平台新功能发布|2024年7月版
本月发布 12 项更新,其中性能优化 3 项、功能优化 8 项、安全性发布 1 项。 1. 性能优化 数据复制 - SQL Server 增量性能优化 调整读取和写入方式,让 SQL Server 增量复制的性能轻松达到 5000 RPS 以上。 数据复制 - Doris|SelectDB|StarRocks 性能优…...
验收测试:确保软件符合业务需求和合同要求
目录 前言1. 验收测试的概念1.1 用户验收测试(UAT)1.2 操作验收测试(OAT) 2. 验收测试的主要作用2.1 确认业务需求的满足2.2 验证合同要求的实现2.3 提升用户信心 3. 验收测试在整个测试中的地位3.1 测试的最后一道关卡3.2 用户与…...
Qt | QChartView+QDateTimeAxis(日期和时间数据图表)+QPieSeries(饼图)
点击上方"蓝字"关注我们 01、QDateTimeAxis QDateTimeAxis 是 Qt 中用于图表的轴类,它专门用于处理日期和时间数据。这个类允许你在图表上显示和解释与日期和时间相关的数据点。例如,在 Qt 的图表库中,你可以使用 QDateTimeAxis 来创建一个时间序列图表,展示股票…...
用闲置的阿里云服务器使用 NPS 实现内网穿透
最近有个项目需要给外地的同事预览一下,但是公司没有可以公网访问的测试服务器,所以想到用内网穿透的方式让外地同事可以访问到我的本机。刚好我有一台阿里云的服务器,双十一打折买了3年,1000左右,2核8G,买…...
一款免费开源绿色免安装的透明锁屏工具
一款免费开源绿色免安装的透明锁屏工具 这个工具的特点就是电脑锁屏的时候,仍然显示原桌面,但是无法操作,需要输入密码才可以解锁。输入密码界面也是隐藏的需要按键才能显示输入密码框。 电脑★★★★★透明锁屏工具:https://pa…...
程序员保持健康的 10 个技巧
长时间坐在电脑前,整天甚至通宵编程、处理 bug 和面对 dealine 的压力。作为一名软件工程师绝对不是一个非常健康的职业。 我经常去欧洲和美国会见许多开发人员。我经常注意到的是:许多开发人员把自己当成机器。他们已经完全放弃了感受身体的感觉&#…...
Java并发迷宫:同步的魔法与死锁的诅咒
在Java编程的宇宙中,有一个充满神秘与挑战的维度——并发编程。它如同一座错综复杂的迷宫,每个角落都潜藏着惊喜与陷阱。在这篇博客里,我们将一起探索这座迷宫的深处,揭开同步的魔法与死锁的诅咒。 第一章:同步魔法的…...
CoderGuide
CoderGuide是一个针对同学们前后端求职面试的开源项目,作为一名互联网/IT从业人员,经常需要搜索一些书籍、面试题等资源,在这个过程中踩过很多坑、浪费过很多时间。欢迎大家 Watch、Star,供各位同学免费使用,永不收费&…...
链式二叉树
链式二叉树,也称为二叉链表,是数据结构中一种非常重要的树形结构表示方法。在链式二叉树中,每个节点不仅包含数据域,还包含两个指针域,分别指向其左子节点和右子节点。这种结构允许二叉树动态地增长和缩减,…...
PHP高校迎新系统-计算机毕业设计源码08468
摘要 随着高校规模的不断扩大和新生人数的增加,传统的手工登记和管理方式已经无法满足高效、准确的需求。为了提升大学新生入学迎新工作的效率和质量,本研究设计开发了一套高校迎新系统。系统通过信息技术的应用,集成了首页、交流论坛、通知公…...
PHP PhantomJS 安装与使用指南
PHP PhantomJS 安装与使用指南 【免费下载链接】php-phantomjs Execute PhantomJS commands through PHP 项目地址: https://gitcode.com/gh_mirrors/ph/php-phantomjs 1. 项目目录结构及介绍 在安装jonnnnyw/php-phantomjs库后,您将得到一个基本的目录结构…...
基于Xinference-v1.17.1的嵌入式Linux开发指南
基于Xinference-v1.17.1的嵌入式Linux开发指南 1. 引言 嵌入式设备上的AI推理一直是个技术挑战,特别是在资源受限的环境中部署大模型。Xinference-v1.17.1作为一个开源推理框架,为嵌入式Linux系统提供了轻量级的AI模型部署方案。无论你是想在树莓派上运…...
霜儿-汉服-造相Z-Turbo模型推理优化:理解与避免神经网络中的耦合过度
霜儿-汉服-造相Z-Turbo模型推理优化:理解与避免神经网络中的耦合过度 不知道你有没有遇到过这种情况:想让AI画一个穿汉服的女孩,结果出来的图,发型和衣服总是一起“跑偏”。比如,你想生成一个“唐代齐胸襦裙”的造型&…...
LumiPixel Canvas Quest人像生成中的数据结构优化实践
LumiPixel Canvas Quest人像生成中的数据结构优化实践 1. 为什么需要优化数据结构 当你用LumiPixel Canvas Quest处理大批量人像时,有没有遇到过程序变慢甚至崩溃的情况?这通常是因为图像数据在内存中的组织方式不够高效。就像整理衣柜一样,…...
40 个 AI agent 跑营销,还不是最狠的
过去一年,AI 做营销最常见的用法,还是写文案、出海报、改标题、做几个短视频脚本。大家也都看腻了。 现在,真正的变化开始了。 AI 开始往营销里最难、最费人、但又最影响结果的地方发起来进攻,那就是: 盯数据、跑测…...
uniapp 如何实现google登录-安卓端
uniapp 如何实现google登录-安卓端 本文只讲解uniapp安卓端如何获取到idToken来实现登录,ios使用uniapp官方方法可以获取 海外app貌似最常用的就是邮箱登录,在app上表现出来最常用的就是谷歌一键登录,或者邮箱加网页验证;google登…...
【Cornerstone3D实战】从零构建医学影像三视图渲染器:Dicom文件加载与多平面重建
1. 医学影像三视图渲染器入门指南 第一次接触医学影像开发的朋友可能会被"Dicom"、"三视图重建"这些专业术语吓到。其实用现代Web技术实现一个基础的医学影像查看器,比你想象中简单得多。Cornerstone3D这个开源库就像医学影像界的jQuery&#x…...
【Python】利用Python实现微信公众号文章定时自动发布
1. 微信公众号自动发布的基础原理 很多人可能不知道,微信公众号其实提供了完整的开发者接口,允许我们通过代码来管理内容。这就像给你的公众号装了一个遥控器,不用每天手动登录后台点点戳戳。我最早发现这个功能时,简直像发现了新…...
AI大模型进化地图:小白也能看懂的技术架构与未来趋势(收藏版)
本文深入剖析AI模型的技术架构、能力瓶颈及商业压力,揭示未来AI模型的四类形态:通用基础大模型、深度推理模型、边缘轻量模型和垂直领域专业模型。文章通过DeepSeek-R1和Google Gemini的案例,量化分析不同模型类型的业务逻辑差异,…...
nRF54L15实现更快的处理速度
Nordic的nRF54L15系统级芯片相比前代nRF52系列,不仅速度更快、功耗更低,还配备了更丰富的外设,” 刘佳杭继续说道,“基于Arm Cortex-M33处理器的HJ-N54L_SIP不仅能处理更复杂的应用程序,同时显著提升了处理速度。系统级…...
