在 Java 中,this 关键字指的是当前对象的引用,它有 5 种用法,下面分别给大家介绍一下。

1、消除语法歧义(最常用)

这种情况一般出现在有参构造器中,当构造器的参数与类的属性(或成员变量)名称完全相同时,导致 Java 编译器无法区别,从而产生语法歧义,编译报错。

解决办法就是使用 this 关键字,如下代码:

public class Man {

private int age;

private String name;

public Man (int age, String name) {

this.age = age;

this.name = name;

}

}

Man 类有两个成员变量,分别是 age 和 name,在使用有参构造器的时候,如果参数名和成员变量的名字相同,就需要使用 this 关键字消除歧义。

其中 this.age 是指类的成员变量,age 是指有参构造器的参数。

2、引用类的其他构造器

当一个类的构造器有多个,可以使用 this 关键字在一个构造器内部调用其他构造器,从而减少代码量

比如说,在无参构造器中调用有参构造器,如下代码:

public class Man {

private int age;

private String name;

public Man(int age, String name) {

this.age = age;

this.name = name;

}

public Man() {

this(23, "张三"); //显示默认构造器调用有参构造器

}

}

也可以在有参构造器中调用无参构造器,如下代码:

public class Man {

private int age;

private String name;

public Man(int age, String name) {

this(); // 有参构造器内部调用显式默认构造器

this.age = age;

this.name = name;

}

public Man() {

}

}

需要注意的是,Java 语法要求 this() 必须是构造器方法体中的第一条语句,否则就会报错。不信,你可以自己试一试哈。

3、作为方法参数传递

先看下面的代码

public class Test {

public Test() {

print(this);

}

private void print(Test test) {

System.out.println("print 方法:" + test);

}

public static void main(String[] args) {

Test test = new Test();

System.out.println("main方法:“+test);

}

}

我在显式默认构造器中调用了 print( ) 方法,然后把 this 关键字作为参数传递给该方法,接着在 print( ) 方法中打印 this 关键字的值。在 程序入口 main() 方法中,实例化 Test 对象,然后同样打印对象名的值。

来打印看一下结果:

print方法: com.cmower.baeldung.this1.ThisTest@573fd745

main方法:com.cmower.baeldung.this1.ThisTest@573fd745

从结果中可以看得出来,this 关键字和 test 对象名都指向同一个对象的引用(或地址),而那个对象就是使用 new 关键字创建的 test 对象。

4、链式调用

学过 JavaScript,或者 jQuery 的读者可能对链式调用比较熟悉,类似于 a.b().c().d(),仿佛能无穷无尽调用下去。

在 Java 中,也可以使用 this 关键字编写链式调用,代码如下:

public class Man {

private int age;

private String name;

public Writer() {

}

public Man SetName(String name) {

this.name = name;

return this;

}

public Man SetAge(String age) {

this.age = age;

return this;

}

}

这时候,创建 Man 对象就可以通过链式调用的方式设置姓名和年龄

Man man = new Man();

man.setName("张三“).setAge(23);

5、在内部类中访问外部类对象

自从 Java 8 的函数式编程出现后,就很少用到 this 在内部类中访问外部类对象了

public class Test {

private String name;

class InnerClass {

public InnerClass() {

Test test = Test.this;

String name = test.name;

}

}

}

在内部类 InnerClass 的构造方法中,通过外部类.this 可以获取到外部类对象,然后就可以使用外部类的成员变量了,比如说 name。

6、总结

以上 5 种 this 关键字的使用没必要全部掌握,很多用法实际项目开发中很少或根本用不到,所以仅作了解而已即可。毕竟我们学 Java 是为了开发,应该关注使用最频繁的用法,如果花费太多精力去研究语言本身的各种稀奇古怪的用法,简直是本末倒置。

java this作为参数_Java this关键字相关推荐

  1. java 接口 this参数_Java BiFunction 接口实例

    原标题:Java BiFunction 接口实例 www.baeldung.com/java-bifunction-interface 1. 简介 Java8 引入了函数式编程,可以把函数作为参数传入 ...

  2. java 命令行参数 _java命令行参数

    原标题:java命令行参数 命令行参数就是main方法里面的参数String[] args他就是一个数组,args只是数据类型的一个名称,就是一个数组的变量,名称无所谓,类型没变就行了.这个就是程序的 ...

  3. java方法可选参数_Java可选参数

    java方法可选参数 在Java类中设计方法时,某些参数对于其执行而言可能是可选的. 无论是在DTO,胖模型域对象还是简单的无状态服务类中,可选方法参数都是常见的. 从本文中, 您将学习如何在Java ...

  4. java变长参数_Java可变长度参数

    术语"varargs"是"variable-length arguments"(可变长度参数)的缩写. 可变长度参数声明一个接受可变数量的参数(或参数)的方法或 ...

  5. java 什么是参数_java中的参数是什么?

    本篇文章介绍了Java中什么是参数,以及参数的两种类型及他们之间的关系,希望对学习Java开发的同学有帮助. java中的参数是什么? 参数分两种:一种叫形式参数,一种叫实际参数 方法名后面括号里面用 ...

  6. java -jar 默认参数_JAVA入门学习指南,建议收藏

    如果你不懂Java 并且想认真学习接触了解一下Java的语法,建议把这篇文章收藏了,多看几遍,应该可以初步掌握Java 大部分基础的语法 . 让我们出发吧!ps:本文有点长,耐心阅读 . 〇,编程环境 ...

  7. java super父类方法_java super关键字,super调用父类构造方法详解

    因为子类不可以继承父类的构造方法,所以,想要调用父类的构造方法的话,那么就可以使用得到super关键字下面的话就来对这个方面做一下详细的讲解. super关键字能够用来访问父类的构造方法.普通方法和属 ...

  8. java方法的参数_Java方法参数

    Java方法参数 在程序设计语言中如何将参数传给方法(或函数): 按值调用:方法接受的是调用者提供的值 按引用调用:方法接受的是调用者提供的地址 Java程序设计语言总是采用按值调用(方法得到的是所有 ...

  9. java客户端传递参数_java – 在客户端传递参数

    我使用RESTful Web服务.在这个Web服务中,我必须传递一个我想要保存为参数的bean. 这是服务器代码: @POST @Consumes(MediaType.APPLICATION_JSON ...

最新文章

  1. List再整理,从代码底层全面解析List(看完后保证收获满满)
  2. 求主析取范式与主合取范式
  3. 阿里达摩院《机器学习算法学习指南》火了,限时开放下载!
  4. 【转】Android编码规范建议18条
  5. 在webpack中使用eslint配置(详细教程)-js教程-PHP中文网
  6. 科研项目 | 深度参与前沿课题研究,全英华人教授协会(ABCP)资深学者亲授
  7. 查看linux网络带宽
  8. git怎么操作会丢失自己的代码_git找回丢失的代码
  9. 第一次正面交火!版主说博文里有广告!
  10. php试题多选,php考试题 (选择题).doc
  11. Web性能瓶颈查找经验总结
  12. 《Lua程序设计》第1章 开始 学习笔记
  13. 理解C语言——从小菜到大神的晋级之路(9)——多维数组
  14. 自适应平台AUTOSAR(Adaptive Platform AUTOSAR)平台设计(6)——通信管理
  15. 运维简历怎么写项目描述_简历中的项目描述
  16. WINDOWS 7 PRO X64 2015年9月增量补丁包微软官方下载地址
  17. [GUET-CTF2019]BabyRSA(p,q灵活应用)
  18. 商品id- item_id /条形码/skuid
  19. 记录--Spyder打开时出现“An error occurred while starting the kernel“
  20. Dell 730xd 加外部硬件 风扇变快

热门文章

  1. unity3d AI 学习--个体行为操控(1)--具体行为类(2)
  2. EasyUI datagrid-detailview
  3. idea 代码提示忽略大小写
  4. Vim查找命令及快捷键
  5. Go 言 Go 语,一文看懂 Go 语言文件操作
  6. Sessionid和Token的区别
  7. 测试简历投递一定要注意这10点,否则大概率会被刷掉
  8. IPFS 二维码添加的问题
  9. Flex代码实现汇总:Flex Loading
  10. Element-UI表格自定义背景颜色