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

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 向子组件传递数据&#xff0c;子组件通过 props 接收数据。 <!-- ParentComponent.vue --> <template><ChildComponent :message"parentMessage"></ChildComponent>…...

NineData云原生智能数据管理平台新功能发布|2024年7月版

本月发布 12 项更新&#xff0c;其中性能优化 3 项、功能优化 8 项、安全性发布 1 项。 1. 性能优化 数据复制 - SQL Server 增量性能优化 调整读取和写入方式&#xff0c;让 SQL Server 增量复制的性能轻松达到 5000 RPS 以上。 数据复制 - Doris|SelectDB|StarRocks 性能优…...

验收测试:确保软件符合业务需求和合同要求

目录 前言1. 验收测试的概念1.1 用户验收测试&#xff08;UAT&#xff09;1.2 操作验收测试&#xff08;OAT&#xff09; 2. 验收测试的主要作用2.1 确认业务需求的满足2.2 验证合同要求的实现2.3 提升用户信心 3. 验收测试在整个测试中的地位3.1 测试的最后一道关卡3.2 用户与…...

Qt | QChartView+QDateTimeAxis(日期和时间数据图表)+QPieSeries(饼图)

点击上方"蓝字"关注我们 01、QDateTimeAxis QDateTimeAxis 是 Qt 中用于图表的轴类,它专门用于处理日期和时间数据。这个类允许你在图表上显示和解释与日期和时间相关的数据点。例如,在 Qt 的图表库中,你可以使用 QDateTimeAxis 来创建一个时间序列图表,展示股票…...

用闲置的阿里云服务器使用 NPS 实现内网穿透

最近有个项目需要给外地的同事预览一下&#xff0c;但是公司没有可以公网访问的测试服务器&#xff0c;所以想到用内网穿透的方式让外地同事可以访问到我的本机。刚好我有一台阿里云的服务器&#xff0c;双十一打折买了3年&#xff0c;1000左右&#xff0c;2核8G&#xff0c;买…...

一款免费开源绿色免安装的透明锁屏工具

一款免费开源绿色免安装的透明锁屏工具 这个工具的特点就是电脑锁屏的时候&#xff0c;仍然显示原桌面&#xff0c;但是无法操作&#xff0c;需要输入密码才可以解锁。输入密码界面也是隐藏的需要按键才能显示输入密码框。 电脑★★★★★透明锁屏工具&#xff1a;https://pa…...

程序员保持健康的 10 个技巧

长时间坐在电脑前&#xff0c;整天甚至通宵编程、处理 bug 和面对 dealine 的压力。作为一名软件工程师绝对不是一个非常健康的职业。 我经常去欧洲和美国会见许多开发人员。我经常注意到的是&#xff1a;许多开发人员把自己当成机器。他们已经完全放弃了感受身体的感觉&#…...

Java并发迷宫:同步的魔法与死锁的诅咒

在Java编程的宇宙中&#xff0c;有一个充满神秘与挑战的维度——并发编程。它如同一座错综复杂的迷宫&#xff0c;每个角落都潜藏着惊喜与陷阱。在这篇博客里&#xff0c;我们将一起探索这座迷宫的深处&#xff0c;揭开同步的魔法与死锁的诅咒。 第一章&#xff1a;同步魔法的…...

CoderGuide

CoderGuide是一个针对同学们前后端求职面试的开源项目&#xff0c;作为一名互联网/IT从业人员&#xff0c;经常需要搜索一些书籍、面试题等资源&#xff0c;在这个过程中踩过很多坑、浪费过很多时间。欢迎大家 Watch、Star&#xff0c;供各位同学免费使用&#xff0c;永不收费&…...

链式二叉树

链式二叉树&#xff0c;也称为二叉链表&#xff0c;是数据结构中一种非常重要的树形结构表示方法。在链式二叉树中&#xff0c;每个节点不仅包含数据域&#xff0c;还包含两个指针域&#xff0c;分别指向其左子节点和右子节点。这种结构允许二叉树动态地增长和缩减&#xff0c;…...

PHP高校迎新系统-计算机毕业设计源码08468

摘要 随着高校规模的不断扩大和新生人数的增加&#xff0c;传统的手工登记和管理方式已经无法满足高效、准确的需求。为了提升大学新生入学迎新工作的效率和质量&#xff0c;本研究设计开发了一套高校迎新系统。系统通过信息技术的应用&#xff0c;集成了首页、交流论坛、通知公…...

设计模式和设计原则回顾

设计模式和设计原则回顾 23种设计模式是设计原则的完美体现,设计原则设计原则是设计模式的理论基石, 设计模式 在经典的设计模式分类中(如《设计模式:可复用面向对象软件的基础》一书中),总共有23种设计模式,分为三大类: 一、创建型模式(5种) 1. 单例模式(Sing…...

【第二十一章 SDIO接口(SDIO)】

第二十一章 SDIO接口 目录 第二十一章 SDIO接口(SDIO) 1 SDIO 主要功能 2 SDIO 总线拓扑 3 SDIO 功能描述 3.1 SDIO 适配器 3.2 SDIOAHB 接口 4 卡功能描述 4.1 卡识别模式 4.2 卡复位 4.3 操作电压范围确认 4.4 卡识别过程 4.5 写数据块 4.6 读数据块 4.7 数据流…...

React Native在HarmonyOS 5.0阅读类应用开发中的实践

一、技术选型背景 随着HarmonyOS 5.0对Web兼容层的增强&#xff0c;React Native作为跨平台框架可通过重新编译ArkTS组件实现85%以上的代码复用率。阅读类应用具有UI复杂度低、数据流清晰的特点。 二、核心实现方案 1. 环境配置 &#xff08;1&#xff09;使用React Native…...

vue3 字体颜色设置的多种方式

在Vue 3中设置字体颜色可以通过多种方式实现&#xff0c;这取决于你是想在组件内部直接设置&#xff0c;还是在CSS/SCSS/LESS等样式文件中定义。以下是几种常见的方法&#xff1a; 1. 内联样式 你可以直接在模板中使用style绑定来设置字体颜色。 <template><div :s…...

算法岗面试经验分享-大模型篇

文章目录 A 基础语言模型A.1 TransformerA.2 Bert B 大语言模型结构B.1 GPTB.2 LLamaB.3 ChatGLMB.4 Qwen C 大语言模型微调C.1 Fine-tuningC.2 Adapter-tuningC.3 Prefix-tuningC.4 P-tuningC.5 LoRA A 基础语言模型 A.1 Transformer &#xff08;1&#xff09;资源 论文&a…...

IP如何挑?2025年海外专线IP如何购买?

你花了时间和预算买了IP&#xff0c;结果IP质量不佳&#xff0c;项目效率低下不说&#xff0c;还可能带来莫名的网络问题&#xff0c;是不是太闹心了&#xff1f;尤其是在面对海外专线IP时&#xff0c;到底怎么才能买到适合自己的呢&#xff1f;所以&#xff0c;挑IP绝对是个技…...

关于easyexcel动态下拉选问题处理

前些日子突然碰到一个问题&#xff0c;说是客户的导入文件模版想支持部分导入内容的下拉选&#xff0c;于是我就找了easyexcel官网寻找解决方案&#xff0c;并没有找到合适的方案&#xff0c;没办法只能自己动手并分享出来&#xff0c;针对Java生成Excel下拉菜单时因选项过多导…...

spring Security对RBAC及其ABAC的支持使用

RBAC (基于角色的访问控制) RBAC (Role-Based Access Control) 是 Spring Security 中最常用的权限模型&#xff0c;它将权限分配给角色&#xff0c;再将角色分配给用户。 RBAC 核心实现 1. 数据库设计 users roles permissions ------- ------…...

在鸿蒙HarmonyOS 5中使用DevEco Studio实现指南针功能

指南针功能是许多位置服务应用的基础功能之一。下面我将详细介绍如何在HarmonyOS 5中使用DevEco Studio实现指南针功能。 1. 开发环境准备 确保已安装DevEco Studio 3.1或更高版本确保项目使用的是HarmonyOS 5.0 SDK在项目的module.json5中配置必要的权限 2. 权限配置 在mo…...

leetcode_69.x的平方根

题目如下 &#xff1a; 看到题 &#xff0c;我们最原始的想法就是暴力解决: for(long long i 0;i<INT_MAX;i){if(i*ix){return i;}else if((i*i>x)&&((i-1)*(i-1)<x)){return i-1;}}我们直接开始遍历&#xff0c;我们是整数的平方根&#xff0c;所以我们分两…...