Java 关键字 this 使用详解(通俗易懂)

news2024/11/20 2:42:34

this关键字主要有以下三个地方使用

        在方法体中引用当前对象,即其方法被调用的对象,以便将当前对象的实例变量或当前对象作为参数传递给其他方法。

① t = this.x;  要在方法中引用当前对象,可以使用关键字 this。

② return this;  作为当前方法的返回值等。

③ z.resetData(this); 关键字 this 指向当前对象,可用于任何可使用对象引用的地方:在句点表示法中,作为方法的参数;

下面是一些使用 this 的例子,其中的注释对相应的用法做了说明。

一、t = this.x;

this 用于指代当前对象,而 .x 则是该对象的属性。因此,this.x 表示当前对象的属性 x

public class MyClass {
    private int x;
    
    public MyClass(int x) {
        this.x = x; // 设置当前对象的属性 x
    }
    
    public int getX() {
        return this.x; // 返回当前对象的属性 x
    }
    
    public static void main(String[] args) {
        MyClass obj = new MyClass(10);
        int t = obj.getX(); // 使用 this.x 赋值给变量 t
    }
}

还有在内部类中,使用this关键字引用外部类对象。

public class OuterClass {
    private int value;
 
    public void outerMethod() {
        InnerClass inner = new InnerClass();
        inner.innerMethod();
    }
 
    public class InnerClass {
        public void innerMethod() {
            OuterClass.this.value = 10; // 使用this关键字引用外部类对象的成员变量
        }
    }
}

二、return this;

return this; 表示从当前方法中返回当前对象的引用,即返回指向当前对象的指针或引用。

当一个方法的返回类型是类本身(或该类的父类或接口),而不是基本数据类型或其他对象类型时,可以使用 return this; 来返回当前对象的引用。

例如,在一个类的方法中,如果你想要返回调用该方法的对象本身,而不是其他值,你可以使用 return this;。这在链式调用或者需要返回当前对象的场景中特别有用。

public class Leaf {
    public static void main(String[] args){

        Leaf leaf = new Leaf();
        leaf.increment().increment().increment().print();
    }

    int i = 0;
     Leaf increment(){
         i++;
         return  this;
     }
     void print(){
         System.out.println("i = " + i);
     }
}

increment方法用于递增实例变量i的值并返回当前对象的引用,以便支持方法链的形式调用,实现了在一个语句中对同一个对象进行了多次操作

三、Peeler.peel(this);

Apple 需要调用 Peeler.peel() 方法,它是一个外部的工具方法,为了将自身传递给外部方法,Apple必须使用 this 关键字。

/**
 * 这段代码实现了一个简单的场景,演示了对象间的方法调用和 toString 方法的使用。
 * 在 main 方法中创建了一个 Person 对象,并调用其 eat 方法,传入一个新创建的 Apple 对象。
 * eat 方法内部调用了传入的 Apple 对象的 getPeeled 方法,获取削皮后的苹果对象。
 * getPeeled 方法内部调用了 Peeler 类的 peel 静态方法,对当前苹果对象进行削皮操作,并返回结果。
 * 削皮操作完成后,削皮后的苹果对象被打印输出到控制台。
 */

public class PassingThis {
    public static void main(String[] args) {
        //在 main 方法中创建了一个 Person 对象,并调用其 eat 方法,传入一个新创建的 Apple 对象。
        new Person().eat(new Apple());
    }
}

class Person {

    // Person 类中定义了一个 eat 方法,接受一个 Apple 对象作为参数。调用传入的 Apple 对象的 getPeeled 方法,获取削皮后的苹果对象,然后打印输出这个削皮后的苹果对象。

    public void eat(Apple apple) {
        Apple peeled = apple.getPeeled();
        // 直接输出 peeled 对象,会调用其 toString 方法
        System.out.println("这个苹果是:" + peeled);
    }
}

class Peeler {

    static Apple peel(Apple apple) {
        // Peeler 类中定义了一个静态方法 peel,接受一个 Apple 对象作为参数,并对这个苹果对象进行削皮操作,削皮操作非常简单,只是直接返回传入的苹果对象,没有进行实际的削皮操作。
        return apple;
    }
}

class Apple {
    Apple getPeeled() {
        // Apple 类中定义了一个 getPeeled 方法,它返回一个经过削皮后的苹果对象。
        // 在这个方法中,通过调用 Peeler 类的 peel 静态方法来实现对当前苹果对象的削皮操作,并将结果返回。
        return Peeler.peel(this);
    }

    @Override
    public String toString() {
        // 在 Apple 类中重写了 toString 方法,使其返回一个描述削皮后苹果的字符串,这样在打印输出时就会显示你自定义的描述,而不是默认的类名和哈希码。
        return "削皮后的苹果";
    }
}

注意:

this 关键字只能在方法内部使用,表示对“调用方法的那个对象”的引用。同时,如果在方法内部调用同一个类的同一个方法,就直接调用,不用加this。

public class Example {
    private int value;

    public Example(int value) {
        this.value = value;
    }

    // 方法内部使用this关键字引用当前对象,并返回当前对象的值
    public int getValue() {
        return this.value;
    }

    // 方法内部调用同一个类的同一个方法,不需要加this
    public void printValue() {
        int val = getValue(); // 直接调用getValue方法
        System.out.println("Value: " + val);
    }

    public static void main(String[] args) {
        Example example = new Example(10);
        example.printValue();
    }
}

        这个示例中,Example类有一个私有成员变量value和两个公共方法getValue和printValue。在getValue方法中,使用了this关键字来引用当前对象,并返回value的值。而在printValue方法中,直接调用了getValue方法,不需要加this关键字。在main方法中,创建了Example类的实例对象,并调用了printValue方法,输出value的值。

参考:

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

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

相关文章

Spring注解开发和XML开发

目录 Spring简介发展史Spring Framework系统架构spring 核心概念IOC、IOC容器、Bean、DIIOC快速入门DI快速入门 IOCBean基础配置id与class属性name属性scope属性 Bean的实例化构造方法静态工厂实例工厂FactoryBean的使用(工厂实例的简化) Bean的生命周期…

160 Linux C++ 通讯架构实战14,epoll 反应堆模型

到这里,我们需要整理一下之前学习的epoll模型,并根据之前的epoll模型,提出弊端,进而整理epoll反应堆模型,进一步深刻理解,这是因为epoll实在是太重要了。 复习之前的epoll的整体流程以及思路。 参考之前写…

DHCP工作过程以及抓包分析

从PC1的e0/0/1接口进行抓包 客户端基于UDP、源端口68、目标端口67进行广播请求,源IP0.0.0.0,(无效地址,代表本地无地址)目标IP255.255.255.255; 从下面截图可以看出: 源mac为电脑mac&#xff…

采用C#.net6.0+Vue,Ant-Design技术开发的一套大型医院手术麻醉信息系统源码,系统成熟,运行稳定

手术麻醉信息系统源码,C#手麻系统源码,自主版权应用案例(适合上项目) 手术麻醉信息系统可以实现手术室监护仪、麻醉机、呼吸机、输液泵等设备输出数据的自动采集,采集的数据能据如实准确地反映患者生命体征参数的变化&…

【Leetcode笔记】102.二叉树的层序遍历

目录 知识点Leetcode代码&#xff1a;ACM模式代码&#xff1a; 知识点 vector、queue容器的操作 对vector<int> vec;做插入元素操作&#xff1a;vec.push_back(x)。对queue<TreeNode*> que;做插入元素操作&#xff1a;que.push(root);。队列有四个常用的操作&…

Redis从入门到精通(六)Redis实战(三)优惠券秒杀

↑↑↑下载测试项目原代码↑↑↑ 文章目录 前言4.3 优惠券秒杀4.3.1 数据表与实体类4.3.2 添加优惠券4.3.2.1 添加普通券代码4.3.2.2 添加秒杀券代码 4.3.3 实现秒杀下单4.3.3.1 秒杀下单逻辑分析4.3.3.2 获取秒杀订单ID4.3.3.3 获取用户ID4.3.3.4 实现秒杀下单 前言 Redis实战…

团体程序设计天梯赛-练习集 01

天梯赛题解合集 团体程序设计天梯赛-练习集 (L1-001 - L1-012) 团体程序设计天梯赛-练习集 (L1-013 - L1-024) 团体程序设计天梯赛-练习集 (L1-025 - L1-036) 团体程序设计天梯赛-练习集 (L1-037 - L1-048) L1-001 Hello World 输出题 样例 输入 输出 Hello World!思…

笔记本电脑win7 Wireless-AC 7265连不上wifi6

1.背景介绍 旧路由器连接人数有限&#xff0c;老旧&#xff0c;信号不稳定更换了新路由器&#xff0c;如 TL-XDR5430易展版用户电脑连不上新的WIFI网络了&#xff0c;比较着急 核心问题&#xff1a;有效解决笔记本连接wifi上网问题&#xff0c;方法不限 2.环境信息 Windows…

深入探索MySQL:成本模型解析与查询性能优化,及未来深度学习与AI模型的应用展望

码到三十五 &#xff1a; 个人主页 在数据库管理系统中&#xff0c;查询优化器是一个至关重要的组件&#xff0c;它负责将用户提交的SQL查询转换为高效的执行计划。在MySQL中&#xff0c;查询优化器使用了一个称为“成本模型”的机制来评估不同执行计划的优劣&#xff0c;并选择…

No dashboards are active for the current data set.

再次记录一下这个离谱的问题 之前出现这个问题是因为目录没写对 今天遇到这个问题的原因是目录是对的&#xff0c;跟目录是否带有中文也没关系 是writer写入的时候写的是空的&#xff0c;离谱的是写入是空的情况下也会生成events日志文件&#xff0c;看起来好像成功写入了一样&…

朗之万方程,机器学习与液体中的粒子运动

目录 一、说明二、朗之万方程的诞生2.1 牛顿力学2.2 流体中的随机运动 三、小质量物体布朗运动方程四、布朗运动的Python代码五、稳定性讨论5.1 波尔兹曼分布5.2 梯度下降算法 六、随机梯度下降&#xff08;SGD&#xff09;和小批量梯度下降七、机器学习与物理&#xff0c;作为…

C++ 类(初篇)

类的引入 C语言中&#xff0c;结构体中只能定义变量&#xff0c;在C中&#xff0c;结构体内不仅可以定义变量&#xff0c;也可以定义函数。 而为了区分C和C我们将结构体重新命名成class去定义 类的定义 标准格式&#xff1a; class className {// 类体&#xff1a;由成员函…

练习14 Web [极客大挑战 2019]Upload

phtml格式绕过&#xff0c;burp修改content-type绕过&#xff0c;常见的文件上传存放目录名 题目就叫upload&#xff0c;打开靶机 直接上传一个图片格式的一句话木马&#xff0c;返回如下&#xff1a; 提交练习5和9中的两种可以执行图片格式php代码的文件&#xff0c;修改con…

Three.js真实相机模拟

有没有想过如何在 3D Web 应用程序中模拟物理相机&#xff1f; 在这篇博文中&#xff0c;我将向你展示如何使用 Three.js和 OpenCV 来完成此操作。 我们将从模拟针孔相机模型开始&#xff0c;然后添加真实的镜头畸变。 具体来说&#xff0c;我们将仔细研究 OpenCV 的两个失真模…

VMware提示 该虚拟机似乎正在使用中,如何解决?

VMware提示 该虚拟机似乎正在使用中,如何解决&#xff1f; 问题描述解决方法1.找到安装VMware的文件目录2.在VMware目录下.lck后缀的文件夹删除或重命名3.运行VMware 问题描述 该虚拟机似乎正在使用中。 如果该虚拟机未在使用&#xff0c;请按“获取所有权(T)”按钮获取它的所…

github生成新的SSH密钥

首先是参考官方文档 生成新的 SSH 密钥并将其添加到 ssh-agent述 当你在创建SSH密钥时遇到提示&#xff1a; Enter file in which to save the key (/c/Users/YOU/.ssh/id_ALGORITHM):这一步是让你选择保存生成的SSH密钥对的文件名和位置。如果你直接按回车键&#xff08;[Pr…

数据结构入门系列-栈的结构及栈的实现

&#x1f308;个人主页&#xff1a;羽晨同学 &#x1f4ab;个人格言:“成为自己未来的主人~” 栈 栈的概念及结构 栈&#xff1a;一种特殊的线性表&#xff0c;其只允许在固定的一段进行插入和删除元素操作&#xff0c;进行数据输入和删除操作的一端称为栈顶&#xff0c;另…

一、Docker部署GitLab(详细步骤)

Docker部署GitLab&#xff08;详细步骤&#xff09; 一、拉取镜像二、启动容器三、修改配置四、修改密码五、浏览器访问 一、拉取镜像 docker安装教程&#xff1a;https://qingsi.blog.csdn.net/article/details/131270071 docker pull gitlab/gitlab-ce:latest二、启动容器 …

CSS 实现航班起飞、飞行和降落动画

CSS 实现航班起飞、飞行和降落动画 效果展示 航班起飞阶段 航班飞行阶段 航班降落 CSS 知识点 animation 属性的综合运用:active 属性的运营 动画分解 航班滑行阶段动画 实现航班的滑行阶段动画&#xff0c;需要使用两个核心物件&#xff0c;一个是跑动动画&#x…

LeetCode-994. 腐烂的橘子【广度优先搜索 数组 矩阵】

LeetCode-994. 腐烂的橘子【广度优先搜索 数组 矩阵】 题目描述&#xff1a;解题思路一&#xff1a;多源广度优先搜索&#xff08;队列实现&#xff09;解题思路二&#xff1a;哈希表实现&#xff0c;先找出所有腐烂和新鲜橘子的集合{}类似于set()。每剔除一次time1解题思路三&…