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

java中的this_深入理解Java中this关键字的使用

d775392540815bf6d2618f2481b3f337.png

Java提供了一个this关键字,this关键字总是指向调用该方法的对象。根据this出现的位置的不同,this作为对象的默认引用有两种情形。

  1. 构造器中引用该构造器正在初始化的对象。
  2. 在方法中引用调用该方法的对象。

this关键字最大的作用就是让类中一个方法,访问该类里的另一个方法或者实例变量。假设定义了一个Person类,这个Person对象的eat()方法需要调用它的move()方法,则如何做呢?是否应该定义如下的Person类呢?

public class Person {

//定义一个move()方法

public void move(){

System.out.println("正在执行move()方法");

}

//定义一个eat()方法,eat()方法需要借助move()方法

public void eat(){

Person p = new Person();

p.move();

System.out.println("正在执行eat()方法");

}

public static void main(String[] args) {

//创建Person对象

Person p = new Person();

//调用Person的eat()方法

p.eat();

}

}

运行结果为:

正在执行move()方法

正在执行eat()方法

以上这种方式确实能够做到在eat()方法里调用move()方法,但从main()方法里的程序中可以看出,一共创建了两个对象:main()方法里创建一个对象;eat()方法里创建一个对象。可是真的需要创建两个对象吗?答案是否定的!因为当程序调用eat()方法时一定会提供一个Person对象,而不需要重新创建一个Person对象了。

因此需要在eat()方法中获得调用该方法的对象,通过this关键字就可以满足这个需求。

this可以代表任何对象,当this出现在某个方法体中时,它所代表的对象是不确定的,但它的类型是确定的,它所代表的类型只能是当前类:只有当这个方法被调用时,它所代表的对象才被确定下来:谁在调用这个方法,this就代表谁。

将上面的Person类中的eat()方法改为一下这种方式更合适:

//定义一个eat()方法,eat()方法需要借助move()方法

public void eat(){

//使用this引用调用eat()方法的对象

this.move();

System.out.println("正在执行eat()方法");

}

上述程序中eat()方法需要依赖于move()方法,现实中这种依赖情形非常常见,例如写字方法需要拿笔的方法,这种依赖都是同一个对象两个方法之间的依赖。因此,Java允许对象的的一个成员直接调用另一成员,可以省略this前缀。也就是说,上面的程序可以改为如下形式:

public void eat(){

move();

System.out.println("正在执行eat()方法");

}

另外一种情形是:this关键字可用于构造器中作为默认引用,由于构造器是直接使用new关键字来调用,而不是使用对象来调用的,所以this在构造器中代表该构造器正在初始化的对象。例如下面的程序:

public class Person {

//定义一个名为age的成员变量

public int age;

//构造器

public Person() {

//在构造器里定义一个age变量

int age = 0;

//使用this代表该构造器正在初始化的对象

//下面的代码将会把该构造器正在初始化的对象的age成员变量设为3

this.age = 3;

}

public static void main(String[] args) {

//使用new Person()创建的对象的age成员变量都将被设为3

//下面代码输出3

System.out.println(new Person().age);

}

}

与普通方法类似的是,大部分时候,在构造器中访问其它成员变量和方法时都可以省略this前缀,但如果构造器中有一个与成员变量同名的局部变量,又必须在构造器中访问这个被覆盖的成员变量,则必须使用this前缀。如上面程序所示。

当this作为对象的默认引用使用时,程序可以像访问普通引用变量一样来访问这个this引用,甚至可以把this当成普通方法的返回值。请看下面程序:

public class Person {

public int age;

public Person grow() {

age ++;

return this;

}

public static void main(String[] args) {

Person p = new Person();

//可以连续调用同一个方法

p.grow().grow().grow();

System.out.println("p对象的age的值是:"+p.age);

}

}

运行结果为:

p对象的age的值是:3

从上面的程序可以看出,如果在某个方法中把this作为返回值,则可以多次连续调用同一个方法,从而使得代码更加的简洁。但这种方式容易造成实际意义的模糊,例如上面的group()方法,用于表示对象的生长,即age变量的值加1,实际上不应该有返回值。

最后需要强调一点:静态成员不能直接访问非静态成员,即static修饰的方法不能访问不适用static修饰的普通方法。对于static修饰的方法而言,可以使用类直接调用该方法,如果在static修饰的方法中使用this关键字,则这个关键字就无法指向合适的对象。所以,static修饰的方法中不能使用this引用。

相关文章:

  • Rediis mysql哪个好_rediis介绍与安装,持久化存储,发布订阅,事务
  • 504 压测geteway_loadrunner压测过程常出现错误和处理方法
  • html命名侧边栏_html+css3+jquery右侧弹出侧边栏导航菜单
  • mysql atlas分表_数据切分——Atlas读写分离Mysql集群的搭建
  • mysql internal_MySQL Internal 札记
  • mysql中8warings_查看MySQL的warnings内容的命令
  • php mysql分页显示图片_php mysql 分页显示代码
  • python中三种分支结构的语句有_Python零基础入门学习09:程序控制流程:顺序结构和分支结构...
  • python蜂窝状六边形_CSS-蜂窝状展示区域(多个六边形)的一种实现方式
  • vue 图片自适应排列插件_vue+heatmap.js实现自定义图片热力图并且自适应
  • 阿里云服务器ubuntu安装mysql_Ubuntu安装MySQL-阿里云开发者社区
  • mysql 2日期什么类型的_【MySQL数据类型2之--日期时间类型】
  • mysql root命令_MySQL 修改 root 密码命令
  • mysql官网指南_MySQL入门指南
  • python 下载图片_Python下载图片
  • 【node学习】协程
  • Consul Config 使用Git做版本控制的实现
  • Django 博客开发教程 16 - 统计文章阅读量
  • ES学习笔记(12)--Symbol
  • express如何解决request entity too large问题
  • IndexedDB
  • maya建模与骨骼动画快速实现人工鱼
  • MobX
  • MySQL用户中的%到底包不包括localhost?
  • Node项目之评分系统(二)- 数据库设计
  • NSTimer学习笔记
  • spring security oauth2 password授权模式
  • 工作中总结前端开发流程--vue项目
  • 湖南卫视:中国白领因网络偷菜成当代最寂寞的人?
  • 基于Javascript, Springboot的管理系统报表查询页面代码设计
  • 买一台 iPhone X,还是创建一家未来的独角兽?
  • 突破自己的技术思维
  • 一道闭包题引发的思考
  • 用 Swift 编写面向协议的视图
  • 长三角G60科创走廊智能驾驶产业联盟揭牌成立,近80家企业助力智能驾驶行业发展 ...
  • 积累各种好的链接
  • ​io --- 处理流的核心工具​
  • ​LeetCode解法汇总2304. 网格中的最小路径代价
  • ​TypeScript都不会用,也敢说会前端?
  • (20050108)又读《平凡的世界》
  • (day 2)JavaScript学习笔记(基础之变量、常量和注释)
  • (Redis使用系列) Springboot 整合Redisson 实现分布式锁 七
  • (没学懂,待填坑)【动态规划】数位动态规划
  • (十三)Java springcloud B2B2C o2o多用户商城 springcloud架构 - SSO单点登录之OAuth2.0 根据token获取用户信息(4)...
  • (四)c52学习之旅-流水LED灯
  • (一)VirtualBox安装增强功能
  • (转)关于多人操作数据的处理策略
  • (转)树状数组
  • (轉貼)《OOD启思录》:61条面向对象设计的经验原则 (OO)
  • *p=a是把a的值赋给p,p=a是把a的地址赋给p。
  • .Net 4.0并行库实用性演练
  • .NET core 自定义过滤器 Filter 实现webapi RestFul 统一接口数据返回格式
  • .NET Framework杂记
  • .net 获取url的方法
  • .NET 使用 ILMerge 合并多个程序集,避免引入额外的依赖