Java中this关键字的几种用法

2023-05-16

1.     当成员变量和局部变量重名时,在方法中使用this时,表示的是该方法所在类中的成员变量。(this是当前对象自己)

如:public class Hello {

    String s = "Hello";

 

    public Hello(String s) {

       System.out.println("s = " + s);

       System.out.println("1 -> this.s = " + this.s);

       this.s = s;//把参数值赋给成员变量,成员变量的值改变

       System.out.println("2 -> this.s = " + this.s);

    }

 

    public static void main(String[] args) {

       Hello x = new Hello("HelloWorld!");

       System.out.println("s=" + x.s);//验证成员变量值的改变

    }

}

结果为:s = HelloWorld!

1 -> this.s = Hello

2 -> this.s = HelloWorld!

s=HelloWorld!

在这个例子中,构造函数Hello中,参数s与类Hello的成员变量s同名,这时如果直接对s进行操作则是对参数s进行操作。若要对类Hello的成员变量s进行操作就应该用this进行引用。运行结果的第一行就是直接对构造函数中传递过来的参数s进行打印结果; 第二行是对成员变量s的打印;第三行是先对成员变量s赋传过来的参数s值后再打印,所以结果是HelloWorld!而第四行是主函数中直接打印类中的成员变量的值,也可以验证成员变量值的改变。

2.把自己当作参数传递时,也可以用this.(this作当前参数进行传递)

      class A {

    public A() {

       new B(this).print();// 调用B的方法

    }

    public void print() {

       System.out.println("HelloAA from A!");

    }

}

class B {

    A a;

    public B(A a) {

       this.a = a;

    }

    public void print() {

       a.print();//调用A的方法

       System.out.println("HelloAB from B!");

    }

}

public class HelloA {

    public static void main(String[] args) {

       A aaa = new A();

       aaa.print();

       B bbb = new B(aaa);

       bbb.print();

    }

}

 结果为:HelloAA from A!

HelloAB from B!

HelloAA from A!

HelloAA from A!

HelloAB from B!

在这个例子中,对象A的构造函数中,用new B(this)把对象A自己作为参数传递给了对象B的构造函数。

3.         有时候,我们会用到一些内部类和匿名类,如事件处理。当在匿名类中用this时,这个this则指的是匿名类或内部类本身。这时如果我们要使用外部类的方法和变量的话,则应该加上外部类的类名。如:

    public class HelloB {

    int i = 1;

 

    public HelloB() {

       Thread thread = new Thread() {

           public void run() {

              for (int j=0;j<20;j++) {

                  HelloB.this.run();//调用外部类的方法

                  try {

                     sleep(1000);

                  } catch (InterruptedException ie) {

                  }

              }

           }

       }; // 注意这里有分号

       thread.start();

    }

 

    public void run() {

       System.out.println("i = " + i);

       i++;

    }

   

    public static void main(String[] args) throws Exception {

       new HelloB();

    }

}

在上面这个例子中, thread 是一个匿名类对象,在它的定义中,它的 run 函数里用到了外部类的 run 函数。这时由于函数同名,直接调用就不行了。这时有两种办法,一种就是把外部的 run 函数换一个名字,但这种办法对于一个开发到中途的应用来说是不可取的。那么就可以用这个例子中的办法用外部类的类名加上 this 引用来说明要调用的是外部类的方法 run

4.    在构造函数中,通过this可以调用同一类中别的构造函数。如:

        public class ThisTest {

    ThisTest(String str) {

       System.out.println(str);

    }

    ThisTest() {

       this("this测试成功!");

    }

 

    public static void main(String[] args) {

       ThisTest thistest = new ThisTest();

    }

}

  

为了更确切的说明this用法,另外一个例子为:

public class ThisTest {

    private int age;

    private String str;

 

    ThisTest(String str) {

       this.str=str;

       System.out.println(str);

    }

    ThisTest(String str,int age) {

       this(str);

       this.age=age;

       System.out.println(age);

    }

 

    public static void main(String[] args) {

       ThisTest thistest = new ThisTest("this测试成功",25);

      

    }

}

        结果为:this测试成功

25

        

值得注意的是:
1
:在构造调用另一个构造函数,调用动作必须置于最起始的位置。

2
:不能在构造函数以外的任何函数内调用构造函数。

3
:在一个构造函数内只能调用一个构造函数。

5this同时传递多个参数。

public class TestClass {

    int x;

    int y;

 

    static void showtest(TestClass tc) {//实例化对象

       System.out.println(tc.x + " " + tc.y);

    }

    void seeit() {

       showtest(this);

    }

 

    public static void main(String[] args) {

       TestClass p = new TestClass();

       p.x = 9;

       p.y = 10;

       p.seeit();

    }

}

 结果为:9 10

代码中的showtest(this),这里的this就是把当前实例化的p传给了showtest()方法,从而就运行了。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java中this关键字的几种用法 的相关文章

  • ADS(ARM Developer Suite)安装与卸载中的问题(转)

    ADS用来对ARM的裸机代码进行编辑和调试 我在安装ADS1 2的过程中 xff0c 遇到了一个小问题 xff0c 写下来和大家分享一下解决方法 1 在安装程序 xff0c 进度条到100 时 xff0c 会一直停在那 xff0c 十几分钟
  • ucosIII 学习资料汇总

    网站 书籍 1 嵌入式实时操作系统uc OS III 邵贝贝译 这本书其实就是一本工具书 xff0c 我参考了官方的说明文档 xff0c 发现雷同很高 感觉就是官方说明文档翻译的 xff0c 用来应用查查接口还有点用 xff0c 不是十分推
  • USB协议传输结构

    USB作为数据通信标准 xff0c 固件可分为枚举配置和类协议部分 xff0c 枚举配置实现USB主机对设备的枚举和配置 xff0c 类协议实现设备各自的数据传输 usb2 0协议chapter8 protocol layer 1 USB协
  • 蓝牙HCI协议

    HCI 层位于蓝牙高层协议和低层协议之间 xff0c 提供了对基带控制器和链路管理器的命令以及访问蓝牙硬件的统一接口 它是我们实现自己的蓝牙设备要接触的第一个蓝牙协议 起着承上启下的作用 HCI通过包的方式来传送数据 命令和事件的 xff0
  • 标准USB设备请求命令

    一 标准的usb设备请求命令 控制传输是最重要和结构最复杂的一种传输类型 控制传输的 初始设置步骤 中包含了1 个8 字节的DATA0 数据包 参见图6 6 这8 字节的数据包是主机用来发送控制阶段中的请求命令的 而这些请求命令是主机配置U
  • 卡尔曼滤波基本公式推导(高斯乘积法)

    前言 卡尔曼滤波的推导这里给出两种推导方法 xff1a 一种是利用高斯乘积定理和贝叶斯公式推导出来 的 xff0c 另一种借用的是最小误差的思想 xff08 IMSE xff09 关于卡尔曼滤波的应用场景以及通俗的解释 xff0c 我相信各
  • 计算机组成原理(唐朔飞)

    计算机组成原理 唐朔飞 存储器 存储器分类 存储介质分类 半导体存储器磁表面存储器磁芯存储器 淘汰 存储方式 存储结构 存储器容量 地址总线 xff1a CPU能访问的地址宽度 xff0c 32地址线表示能访问2的32次方个存储单元地址 数
  • ubuntu配置静态IP、DNS地址

    虚拟机需要使用桥接上网 1 ifconfig 查看网卡信息 2 vi etc network interfaces 打开并编辑配置文件 配置说明 xff1a auto lo iface lo inet loopback auto ens33
  • c调用libcurl库发送GET 和 POST请求

    libcrul请求的基本套路流程 1 调用curl global init 初始化libcurl2 调用curl easy init 函数得到 easy interface型指针3 调用curl easy setopt 设置传输选项4 根据
  • LINUX 操作GPIO口

    两种方法 1 写驱动的方式 缺 2 通过linux提供的用户空间 终端控制 通过在用户空间上来操作GPIO xff0c 控制入口在 xff1a sys class gpio 首先确认内核里是否已选择上gpiolib的sysfs接口功能 默认
  • V4L2简介

    http work blog readthedocs org en latest v4l2 20intro html 第一章 V4L2简介 1 1 什么是v4l2 V4L2 xff08 Video4Linux的缩写 xff09 是Linux
  • 电子设计项目

    全套完整毕业设计智能家居控制系统设计 16X16点阵滚动显示 单片机595 43 138LED点阵 基于WIFI传输的单片机传感器设计 xff08 毕业论文 xff09 基于单片机设计的多点测温系统 数码管显示温度 基于单片机设计的公交报站
  • 视觉惯导里程计VIO综述

    最近阅读了VIO中的一些论文 xff0c 在这里做个汇总方便以后查阅 xff0c 如有问题欢迎指正 一 背景 VIO xff08 Visual Inertial Odometry xff09 视觉惯导里程计 xff0c VINS xff08
  • 【Cocos2d-X-2.1.4游戏引擎】发布第一个游戏

    有一段时间没更新博客了 xff0c 最近一直在写一个小游戏 xff0c 游戏在今天终于搞好了 xff0c 又可以开始写写博客 xff0c 打打dota的悠闲的日子了哈 看了十几天cocos2d x后 xff0c 也依照官网的例子写了个打飞机
  • 游戏升级之路

    七十一雾央原创 转载请注明 http blog csdn net hust xy 楼主学习编程有两年了 xff0c 决定向游戏发展大概就是半年前了 xff0c 在这里总结一下游戏方面的学习经历过 xff0c 给初学的朋友们参考下 xff0c
  • Nmap安装和使用详解

    文章目录 Nmap概述功能概述运行方式 Nmap安装Nmap参数详解目标说明主机发现端口扫描端口说明和扫描顺序服务与版本探测脚本扫描操作系统探测时间和性能防火墙 IDS规避和欺骗输出选项使用示例 常用扫描命令扫描ip地址或域名扫描整个网段扫
  • MSCKF_VIO:MSCKF的双目版本

    论文 xff1a MSCKF的双目版本 Robust Stereo Visual Inertial Odometry for Fast Autonomous Flight 下载地址 xff1a 点击 源码地址 xff1a https git
  • 功能测试,系统测试,兼容性测试,手工测试

    功能测试 功能测试一般需要根据编写的 测试用例 xff0c 执行测试用例 xff0c 执行的过程中提交缺陷 xff1b 功能测试一般至少会有两轮 xff0c 遇到比较麻烦的项目甚至会有三到四轮 xff0c 而每一轮测试都有其侧重点 xff0
  • C++ sdk 获取执行文件所在路径

    TCHAR szFilePath MAX PATH 43 1 61 0 GetModuleFileName NULL szFilePath MAX PATH tcsrchr szFilePath T 39 39 1 61 0 szFileP
  • UART串口

    一 串口的历史 首先 xff0c 串口对每一个做硬件和嵌入式软件的人来说 xff0c 就是一个必备的工具 xff0c 调试一个带MCU或者CPU的系统 我们在调试的过程中 xff0c 一般第一件事情 xff1a GPIO点灯 xff0c 第

随机推荐

  • C++软件工程师的发展前景如何?

    目前国内的嵌入式开发非常火 xff0c 而C 43 43 主要用于底层的嵌入式开发 驱动开发等 xff0c 也用于WINCE等嵌入式系统的应用软件开发 可以说C 43 43 软件工程师发展前景还是不错的 xff0c 下面就给大家具体介绍一下
  • 成为一名C++开发工程师,需要具备哪些条件?

    C 43 43 是C语言的继承 xff0c 它既可以进行C语言的过程化程序设计 xff0c 又可以进行以抽象数据类型为特点的基于对象的程序设计 xff0c 还可以进行以继承和多态为特点的面向对象的程序设计 C 43 43 擅长面向对象程序设
  • 一年精通,三年熟悉,五年了解,十年用过!C++真的这么难吗?

    C 43 43 有句俗话说 xff1a 一年精通 三年熟悉 五年了解 十年用过 如果可以把C 43 43 程序员分层的话 xff0c 看看你在第几层 xff1f 第0层 掌握基本的C 43 43 语法 xff0c 会写一些基本的if els
  • 【C语言实现贝塞尔曲线】无聊人士专用程序,PS钢笔工具最初原形~

    简介 动态演示贝塞尔曲线的绘制过程 支持任意点数 任意阶次 点击鼠标右键 xff0c 在鼠标位置将创建新的点 按住鼠标左键拖动控制点 空格键屏幕将清空 一起来玩一玩吧 xff01 运行效果 源码 程序名称 xff1a 贝塞尔曲线 inclu
  • c++ stream iword、pword和register_callback函数

    pword xff0c stream 的 register callback函数 include lt iostream gt include lt sstream gt using namespace std const int name
  • AWS CLI version 2 在 Windows 下的安装

    首先你需要到下面的链接地址中下载需要的应用 xff1a https awscli amazonaws com AWSCLIV2 msi 双击运行 双击运行下载的可以运行的文件 下一步继续 下一步继续安装进程 许可协议 你需要同意许可协议后继
  • MATLAB安装时为英文如何切换中文

    MATLAB安装时为英文如何切换中文 MATLAB安装问题 问题描述 2018b及以上版本的MATLAB安装时 xff0c 其中英文模式会根据电脑所在区域环境进行配置 若电脑所在区域环境不在中国 xff0c 则MATLAB初始化安装会被定义
  • VINS-Fusion-RGBD在双轮差数轮小车上配置并进行稠密建图

    VINS Fusion RGBD在小车上进行稠密建图 1 轮式里程计代替视觉里程计2 其他获得更为鲁棒性建图效果的做法3 点云地图及栅格地图的获得4 多个参数可配置 VINS Mono由于存在运动初始化过程 xff0c 对于地面小车来说运动
  • ST LINK V2.1接线图

    方便查询 xff0c 图片来源已经忘记了 xff0c 如有冒犯请通知我 特此记录以防忘记 anlog 2020年8月29日
  • ROS笔记之Gazebo机器人仿真(二)——Soildworks搭建机器人模型

    1 引言 机器人的模型是通过URDF文件进行描述 xff0c 具体说明可以参考URDF 但对于一些复杂的机器人 xff0c 通过直接编写URDF文件就比较繁琐 xff0c 这里我们介绍一种通过专业的三维建图软件Soildworks构建模型然
  • ROS笔记之Gazebo机器人仿真(四)——Rviz及Gazebo下机器人模型显示

    1 引言 上一章中我们成功导出了URDF文件 xff0c 这章中我们将学习如何在Rviz和Gazebo下显示我们创建的三维模型 2 预备 首先 xff0c 我们需要对导出的URDF文件进行下修改 xff08 1 xff09 package
  • 制作树莓派镜像img,并在其他新板上使用,实现批量克隆树莓派板

    1 将现有的系统制作成镜像img 2 配置网络 1 将现有的系统制作成镜像img 1 1 先将新买的sd卡用SDFormatter工具格式化 xff0c 以作备用 1 2 将带有系统的sd卡用Win32DiskImager exe工具Rea
  • Qt开发-Qt对象间的关系

    一 Qt对象间的关系 1 Qt对象间可以存在父子关系 xff08 1 xff09 每个对象都保存有它所有子对象的指针 xff08 2 xff09 每一个对象都有一个指向其父对象的指针 2 当指定Qt对象的父对象时 xff08 1 xff09
  • VScode+esp-idf:例程(esp32-web-camera)保存视频到sd卡(附源码)

    文章目录 1 移植到 esp32 web camera 2 jpeg2avi使用方法2 1 何处调用jpeg2avi start2 2 何处调用jpeg2avi add frame2 3何处调用jpeg2avi end 3 编译运行工程4
  • 单片机能代替PLC吗?过来人告诉你

    随着科技的进步和市场的需要 xff0c 近年来出现了 非常多 类似Arduino 这样的开源电子原型平台 xff0c 它们大部分实现了对单片机的二次封装 xff0c 所有外设 模块接口都是现成的 xff0c 对于 使用者 的要求 只需懂C语
  • STM32学到什么程度可以就业

    很多在门外观望的朋友总会有这些担心 STM32难不难学 xff1f 学到什么程度可以去工作 xff1f 前景怎么样 xff1f 对应的工资高不高 xff1f 对于小编来说最难的事你已经在做了 xff0c 就是还在门口观望 xff0c 望来望
  • 那么辛苦的熬单片机,不拿它DIY点小玩意怎么对得起自己。

    大家好 xff0c 我是华维蔵鹰 xff0c 不管你处于什么身份 做任何一件事情你都会需要一个动力的源泉 在大学中很多人弹吉他并不是爱好它 xff0c 只是为了多点机会去接触些妹子 xff0c 就像我们以前刚入门单片机的时候 xff0c 都
  • 众人寻AI千百度

    引 xff1a 说起AI xff0c 或许很多普通人仍然不清楚这是什么 然而说起人工智能 xff0c 机器人 xff0c 想必大家不是如雷贯耳也是耳濡目染 xff0c 略知一二 从小我们便不断的从电影 xff0c 电视剧中接触AI xff0
  • PID知识总结

    PID算法算是控制系统中一个比较常见的控制算法了 xff0c 特别是在闭环控制系统中 xff0c PID的使用尤为常见 xff0c 鄙人由于电赛延期在家闲来无事 xff0c 决定把自己在电赛备赛期间所学的PID知识总结一下 xff0c 希望
  • Java中this关键字的几种用法

    1 当成员变量和局部变量重名时 xff0c 在方法中使用this 时 xff0c 表示的是该方法所在类中的成员变量 xff08 this 是当前对象自己 xff09 如 xff1a public class Hello String s 6