Java中的this关键字

news2024/11/15 6:54:54

介绍

this关键字用于引用当前实例,在Java语言中,当创建一个对象后,Java虚拟机就会为其分配一个指向对象本身的指针,这个指针就是“this”。

Java关键字this只能用于方法方法体内,在类中的非静态方法中使用,静态方法和静态的代码块中绝对不能出现this,并且this只和特定的对象关联,而不和类关联,同一个类的不同对象有不同的this。

在《Java编程思想》第四版第五章5.4⼩节对 this 关键字是这样介绍的:

this 关键字只能在⽅法内部使⽤,表示对“调⽤⽅法的那个对象”的引⽤。

应用

this关键字主要有三个应用:
(1)this调用本类中的属性,也就是类中的成员变量;
(2)this调用本类中的其他方法;
(3)this调用本类中的其他构造方法,调用时要放在构造方法的首行。

(1)调用成员变量

public class day13_2 {
    public static void main(String[] args){
        MyPerson p = new MyPerson();
        p.name = "小白";
        System.out.println("应该是小白:"+p.name);
        p.setName("小明");
        System.out.println("应该是小明:"+p.name);
    }
}
class MyPerson {   
    String name;   //直接在类中定义变量,表示类具有的属性

    void setName(String name){
        name = name;
        //出现重名时,优先使用作用域最接近的,
        // 这里实际上是将方法参数的局部变量name赋值为本身
    }
}

运行结果如下:
在这里插入图片描述

很明显,对象p的name属性在使用setName()后,并没有达到想要的修改的效果。

这是因为什么呢? 因为此时操作的name实际上是方法中的,与类中的属性完全没有关系

代码中,有成员变量name,有方法的形参name,然后在方法中将形参name的值传递给成员变量name,当然,我们是一定懂这个逻辑的,但是java编译器要如何判断使用哪一个变量呢?是将形参name的值传递给成员变量name,还是反过来讲成员变量name的值传递给形参name呢?

当出现重名的时候,因为默认情况下会优先使用作用域最近的变量,如何才能表示用使用的变量是类的成员变量呢?

p.name = "小白";
System.out.println("应该是小白:"+p.name);
也可以看到,上面在使用这两句时,通过"对象.属性"的形式访问到了当前对象p的属性name

那么,如果我们想要在方法内访问当前对象的属性,便可以使用this关键字,来明确表示当前类的示例对象本身:也就是说,使用this关键字代表的就是类中的成员变量,又叫做类的属性

 void setName(String name){
        this.name = name; //让当前对象的name变量值等于参数传入的值
    }

这样就可以修改成功了,当然,如果方法内没有变量出现重名的情况,那么默认情况下可以不使用this关键字来明确表示当前对象:

String getName() {
    return name;    //这里没有使用this,但是当前作用域下只有对象属性的name变量,所以说直接就使用了
}

上面举的例子是以形参为例,其实如果是局部变量的话,也是相同的道理。

在方法体内定义的变量称为局部变量,在类的内部 方法体的外部定义的变量称为成员变量,

若方法中的局部变量与成员变量名字相同时,那么**在方法中成员变量将会被屏蔽**。

若此时仍要使用成员变量,就需要使用关键字this:this.成员变量名

(2)调用本类中的其他方法

如上所述,既然**this可以调动本类中的成员变量,那么,也就可以调动本类中的成员方法**

public class day13_2 {
    public static void main(String[] args){
        MyPerson p = new MyPerson();
        p.setName("小明");
        System.out.println("应该是小明:"+p.name);
    }
}
class MyPerson {   
    String name;   //直接在类中定义变量,表示类具有的属性
    
    void setName(String name){
        this.name = name;
        this.print();   //调用本类中的print()方法
    }
    void print(){
        System.out.println("完成设置");
    }
}

运行结果如下:
在这里插入图片描述

一般在java中引用成员变量或成员方法都是以对象名.成员变量或者对象名.成员方法的形式.

不过在没有相同变量的时候,也可以使用this.成员变量的形式来引用变量 。

这主要是从便于代码的阅读考虑。看到this关键字就知道现在引用的变量是成员变量或者成员方法,而不是局部变量。这无形中就提高了代码的阅读性。

(3)调用类的构造方法

Java类中,构造方法无需写返回值,且方法名称与类名相同,在Java类中必须存在一个构造方法。

若在代码中没有显式的构造方法,那么编译器在编译时会自动添加一个没有形参的构造方法。

一个类中可以存在多个构造方法,这些构造方法都用相同的名字,只是形参不同,Java语言会根据传入参数来判断调用哪一个构造方法。

当一个类中有多个构造方法时,可以利用this关键字相互调用。

public class day13_2 {
    public static void main(String[] args){
        MyPerson p = new MyPerson();
        System.out.println("名字是韩梅梅:"+p.name+"\n年龄是12:"+p.age);
    }
}
class MyPerson {   //这里定义的人类具有三个属性,名字、年龄、性别
    String name;   //直接在类中定义变量,表示类具有的属性
    int age;
    String sex;
    MyPerson(){
        this("韩梅梅",12);//调用有两个参数的构造方法
        System.out.println("无参构造函数  调用  两个参的构造函数");
    }
    MyPerson(String name,int age){
        this(name);
        System.out.println("两个参的构造函数  调用  一个参构造函数");
        this.age = age;
    }
    MyPerson(String name){
        this.name = name;
    }
}

运行结果如下:
在这里插入图片描述
在使用this关键字调用其他构造方法的时候,this()调用构造方法只能放在构造方法的首行,为的是能够为类中的属性初始化;

而且至少有一个构造方法是不用this调用,否则程序会出现错误。

//如果上述代码中,一个参数的构造函数,也用this调用其它构造函数
    MyPerson(String name){
        this();
    }
//这时候构造方法就出现了递归调用,程序出错。

注意的是,使用this调用构造方法只适用于构造方法的调用,类中的其他方法不能使用这种方法。

(4)返回对象的值★

this最重要的特点就是表示当前对象:java中当前对象就是指当前正在调用类中方法的对象。

使用this引用当前对象是指**如果在类的方法中需要返回一个对象,并且该对象是方法所在的类的当前对象**,可以使用this关键字作为方法的返回值。

**注意:**这种用法如果在内部类中使用,可能会导致结果与预期不一致,因为this将代表内部类的实例而不是外部类的实例。

class Test2 {
    String s="";
    public static void main(String[] args) {
        Test2 t = new Test2();
        t.method("111");
        t.method("222");
        t.method("333");
        t.method2();
    }
    public Test2 method(String str) {
        s+=str;
        return this;  //return this; 语句一般都是用在类中非静态方法的末尾
    }
    public void method2() {
        System.out.println(s);
    }
}

运行结果如下:
在这里插入图片描述

其实,可以将上述代码的逻辑理解为t.method("111").method("222").method("333");

return this; 语句一般都是用在类中非静态方法的末尾。在java中类的非静态方法是属于对象的,this则代表当前这个非静态方法属于的对象,并且是当前类的对象。

  • day13 HJ48从单向链表中删除指定值的节点(Java)这篇文章中便使用到了return this的语句,可以通过这道算法题更直观的去理解知识点

扩展—— 讲一下对象的使用

  • 我们使用一个变量来指代某对象,而引用类型的变量,存储的是对象的引用

    • public static void main(String[] args) {
          Person p1 = new Person();
          Person p2 = p1;
      }
      
    • 上面的代码将变量p2赋值为p1的值,那么实际上只是传递了对象的引用,而不是对象本身的复制

    • 在这里插入图片描述

    • public class day13_1 {
          public static void main(String[] args) {
              Person p1 = new Person();
              Person p2 = p1;
              p1.name = "小明";  
              System.out.printlnp1.name=:"+p1.name); 
              p2.name = "大明";   
              System.out.println("p1.name=:"+p1.name);  
              System.out.println("p2.name=:"+p2.name);
              System.out.println("p1.name=:"+p1.name);
          }
      }
      class Person {   //这里定义的人类具有三个属性,名字、年龄、性别
          String name;   //直接在类中定义变量,表示类具有的属性
          int age;
          String sex;
      }
      
    • 在这里插入图片描述

    • 由运行结果,就可以很直白的看出,p1和p2保存的是同一个对象的引用,通过其中一个修改,另一个读取时也会得到修改后的答案

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

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

相关文章

14 Java集合(集合框架+泛型+ArrayList类+LinkedList类+Vector类+HashSet类等)

本篇主要是集合框架基础和List集合,Map集合等等后续更 集合14.1 集合框架14.1.1 概念14.1.2 集合架构14.2 Collection接口14.2.1 常用方法14.3 迭代器14.3.1 迭代器原理14.3.2 迭代器使用常见问题14.4 泛型基本使用14.5 ArrayList类14.5.1 常用方法14.5.2 实现原理1…

【手写 Vue2.x 源码】第三十三篇 - diff算法-收尾+阶段性总结

一,前言 上篇,diff算法-乱序比对,主要涉及以下几个点: 介绍了乱序比对的方案介绍了乱序比对的过程分析实现了乱序比对的代码逻辑 本篇,diff 算法的阶段性梳理 二,初渲染与视图更新流程 Vue 初渲染时&…

注册商标需要哪些材料和条件?

申请注册商标条件是什么1、申请人必须是申请认定商标的所有人,是在当省区域内的自然人、法人和其他组织;2、该商标自核准注册之起连续使用满三年并继续有效,且无权属争议;3、该商标为相关公众所熟知,在相关市场内具有较高的知名度;4、该商标核…

亚信科技AntDB数据库荣获2022年度技术卓越奖

近日,业界知名IT垂直媒体IT168发布了“2022技术卓越奖”主题奖项,亚信科技AntDB数据库荣获技术卓越奖。 2022 “技术卓越奖”由行业CIO/CTO大咖、技术专家及IT媒体三方联合评选,评判标准代表了用户和媒体声音。经过多方评审,亚信科…

jvm参数简介

Xmx3550m:设置JVM最大堆内存为3550M。 -Xms3550m:设置JVM初始堆内存为3550M。此值可以设置与-Xmx相同,以避免每次垃圾回收完成后JVM重新分配内存。 -Xss128k:设置每个线程的栈大小。JDK5.0以后每个线程栈大小为1M,之…

【SCL】1200应用案例:交通灯模拟自动装料控制

使用博图SCL语言来编写 交通灯模拟控制 和 自动装料应用案例 文章目录 目录 前言 一、应用:交通灯模拟控制 1.控制要求 2.I\o分配和接线 3.程序编写和效果 4.小结 二、自动装料模拟控制 1.控制要求 2.I/O分配 3.程序编写 4.小结 总结 前言 本篇文章我们继续学习西…

宏任务和微任务

宏任务和微任务1. 什么是宏任务和微任务2. 宏任务和微任务的执行顺序3. 去银行办业务的场景4. 分析以下代码输出的顺序5. 经典面试题1. 什么是宏任务和微任务 JavaScript 把异步任务又做了进一步的划分,异步任务又分为两类,分别是: ① 宏任…

寄存器、RAM、ROM、Flash

单片机寄存器简述 寄存器详细请点这里 1、单片机寄存器就是单片机片内存储器(片内RAM)一部分,每一个都有地址。只不过这几个寄存器有特殊的作用,比如指令:MUL AB,这条指令用到两个寄存器A,B进行乘法,结果存到BA里面&a…

kaggle竞赛 | Quora Insincere Question | 文本情感分析

目录赛题背景赛题评价指标数据集分析pytorch建模之前发布了一遍实战类的情感分析的文章,包括微博爬虫,数据分析,相关模型。 可以参考: https://blog.csdn.net/lijiamingccc/article/details/126963413 比赛链接: http…

Spring Boot学习篇(十二)

Spring Boot学习篇(十二) shiro安全框架使用篇(四) 2 在主页显示用户登录状态、用户信息和完成默认注销(不改shiro原来的配置)操作 2.1 变更SysUserController类 2.1.1 在SysUserController类中注入sysUserMapper Autowired SysUserMapper sysUserMapper;2.1.2 在SysUserC…

1598_AURIX_TC275_GPIO功能以及部分寄存器梳理1

全部学习汇总: GreyZhang/g_TC275: happy hacking for TC275! (github.com) 接下来,看一下GPIO的寄存器以及部分相关的功能。这部分将会是接下来这个章节剩余的全部,可能内容偏雷同,因此都是跳跃式看。但是中间需要临时关注一下的…

【2022年MathorCup大数据竞赛】B题:北京移动用户体验影响因素研究(二)(问题一的分析和结果)

目录:题目解析一、问题的解答框架二、问题一的分析2.1 附件1的处理流程2.2 附件2的处理流程2.2.1 拉格朗日插补法2.3 数据编码2.4 相关分析2.5 基于互信息GBDT的特征提取2.6 量化分析一、问题的解答框架 二、问题一的分析 针对问题一,首先需要对附件1和…

《MySQL高级篇》十二、MySQL事务日志

文章目录1. redo日志1.1 为什么需要REDO日志1.2 REDO日志的好处、特点1. 好处2. 特点1.3 redo的组成1.4 redo的整体流程1.5 redo log的刷盘策略1.6 不同刷盘策略演示1. 刷盘策略分析2. 举例1.7 写入redo log buffer 过程1. 补充概念:Mini-Transaction2. redo 日志写入log buffe…

「链表」数据结构简析

前言 前言:研究一个数据结构的时候,首先讲的是增删改查。 文章目录前言一、链表简介1. 含义2. 节点组成3. 存储方式1)数据在内存中的存储方式2)单链表在内存中的存储方式2)双链表在内存中的存储方式2)循环链…

程序地址空间

目录 1. 验证程序地址空间布局图 2. 虚拟地址空间 什么是虚拟地址空间 3. 进程地址空间 4. 为什么要有虚拟地址空间 1. 有效保护物理内存 2. 使内存管理模块和进程管理模块实现解耦合 3. 将内存分布有序化 1. 验证程序地址空间布局图 下面我们写段代码验证一下上图中…

qt调用matlab生成的dll库

最近由于在项目中要用到matlab的算法,而用C转换matlab算法非常麻烦,所以采用qtmatlab混合编程的方法,在使用中遇到了些许问题,特记录如下。 一、生成matlab库 1、首先需要下载matlab完整版,之前在网上下载的简版&…

基于C#制作一个休息提醒闹钟

> 此文主要通过WinForm来制作一个休息提醒闹钟,通过设置时间间隔进行提醒,避免沉浸式的投入到工作或者学习当中,战斗的同时也要照顾好自己。 实现流程1.1、创建项目1.2、时间间隔配置页1.3、闹钟提醒页1.4、开机自启动配置1.5、日志记录1.…

一个数据库文档生成神器

Gitee项目地址,可以直接去开源项目查看(推荐) 简介 在企业级开发中、我们经常会有编写数据库表结构文档的时间付出,从业以来,待过几家企业,关于数据库表结构文档状态:要么没有、要么有、但都是…

MySql 5.7.40备份到腾讯云cos+从cos恢复

1 备份 1.1 安装coscli # wget https://github.com/tencentyun/coscli/releases/download/v0.12.0-beta/coscli-linux # mv coscli-linux /usr/bin/coscli # chmod 755 /usr/bin/coscli # coscli --version如果github慢可以使用国内镜像: wget https://cosbrowse…

数电相关知识

文章目录 逻辑电路与或非异或 门电路与的物理电路电压比较器D型锁存器优先编码器边沿触发器RS触发器施密特触发器基本原理555定时器数电电平TTL器件CMOS器件逻辑电路 与或非异或 门电路 与乘大于1或加大于1异或异性为1,异吗? 与的物理电路