this 关键字是 Java 常用的关键字,可用于任何实例方法内指向当前对象,也可指向对其调用当前方法的对象,或者在需要当前类型对象引用时使用。

this表示当前对象

下面我们根据示例分别讲解 this 关键字的作用:

this.属性名—调用本类中的属性,也就是类中的成员变量

大部分时候,普通方法访问其他方法、成员变量时无须使用 this 前缀,但如果方法里有个局部变量和成员变量同名,但程序又需要在该方法里访问这个被覆盖的成员变量,则必须使用 this 前缀。
例 1

public class Student{String name;private void SetName(String name){this.name = name;}
}

解析:

代码中,创建了一个Student类,有成员变量name与方法SetName(String name)。

由于成员变量与方法接收的形参名称相同,都是name。所以,这里就用了this关键字来调用本类中的成员变量

例2:
假设有一个教师类 Teacher 的定义如下:

public class Teacher {private String name;    // 教师名称private double salary;    // 工资private int age;    // 年龄
}

在上述代码中 name、salary 和 age 的作用域是 private,因此在类外部无法对它们的值进行设置。为了解决这个问题,可以为 Teacher 类添加一个构造方法,然后在构造方法中传递参数进行修改。代码如下:

// 创建构造方法,为上面的3个属性赋初始值
public Teacher(String name,double salary,int age) {this.name = name;    // 设置教师名称this.salary = salary;    // 设置教师工资this.age = age;    // 设置教师年龄
}

在 Teacher 类的构造方法中使用了 this 关键字对属性 name、salary 和 age 赋值,this 表示当前对象。this.name=name语句表示一个赋值语句,等号左边的 this.name 是指当前对象具有的变量 name,等号右边的 name 表示参数传递过来的数值。

创建一个 main() 方法对 Teacher 类进行测试,代码如下:

public static void main(String[] args) {Teacher teacher = new Teacher("王刚",5000.0,45);System.out.println("教师信息如下:");System.out.println("教师名称:"+teacher.name+"\n教师工资:"+teacher.salary+"\n教师年龄:"+teacher.age);
}

运行该程序,输出的结果如下所示。

教师信息如下:
教师名称:王刚
教师工资:5000.0
教师年龄:45

提示:当一个类的属性(成员变量)名与访问该属性的方法参数名相同时,则需要使用 this 关键字来访问类中的属性,以区分类的属性和方法中的参数。

this.方法名—调用方法

this 关键字最大的作用就是让类中一个方法,访问该类里的另一个方法或实例变量。

例 1:
假设定义了一个 Dog 类,这个 Dog 对象的 run( ) 方法需要调用它的 jump( ) 方法,Dog 类的代码如下所示:

/*** 第一种定义Dog类方法**/
public class Dog {// 定义一个jump()方法public void jump() {System.out.println("正在执行jump方法");}// 定义一个run()方法,run()方法需要借助jump()方法public void run() {Dog d = new Dog();d.jump();System.out.println("正在执行 run 方法");}
}

使用这种方式来定义这个 Dog 类,确实可以实现在 run( ) 方法中调用 jump( ) 方法。下面再提供一个程序来创建 Dog 对象,并调用该对象的 run( ) 方法。

public class DogTest {public static void main(String[] args) {// 创建Dog对象Dog dog = new Dog();// 调用Dog对象的run()方法dog.run();}
}

在上面的程序中,一共产生了两个 Dog 对象,在 Dog 类的 run( ) 方法中,程序创建了一个 Dog 对象,并使用名为 d 的引用变量来指向该 Dog 对象。在 DogTest 的 main() 方法中,程序再次创建了一个 Dog 对象,并使用名为 dog 的引用变量来指向该 Dog 对象。

下面我们思考两个问题。

1)在 run( ) 方法中调用 jump( ) 方法时是否一定需要一个 Dog 对象?

答案是肯定的,因为没有使用 static 修饰的成员变量和方法都必须使用对象来调用。

2)是否一定需要重新创建一个 Dog 对象?

不一定,因为当程序调用 run( ) 方法时,一定会提供一个 Dog 对象,这样就可以直接使用这个已经存在的 Dog 对象,而无须重新创建新的 Dog 对象了。因此需要在 run() 方法中获得调用该方法的对象,通过 this 关键字就可以满足这个要求。

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

将前面的 Dog 类的 run( ) 方法改为如下形式会更加合适,run( ) 方法代码修改如下,其它代码不变。

/*** 第二种定义Dog类方法**/
// 定义一个run()方法,run()方法需要借助jump()方法
public void run() {// 使用this引用调用run()方法的对象this.jump();System.out.println("正在执行run方法");
}

从第一种 Dog 类定义来看,在 Dog 对象的 run( ) 方法内重新创建了一个新的 Dog 对象,并调用它的 jump( ) 方法,这意味着一个 Dog 对象的 run( ) 方法需要依赖于另一个 Dog 对象的 jump( ) 方法,这不符合逻辑。

第二种 Dog 类定义是当一个 Dog 对象调用 run( ) 方法时,run( ) 方法需要依赖它自己的 jump( ) 方法,与第一种定义类的方法相比,更符合实际情形。

在现实世界里,对象的一个方法依赖于另一个方法的情形很常见,例如,吃饭方法依赖于拿筷子方法,写程序方法依赖于敲键盘方法。这种依赖都是同一个对象两个方法之间的依赖。因此,Java 允许对象的一个成员直接调用另一个成员,可以省略 this 前缀。也就是说,将上面的 run( ) 方法改为如下形式也完全正确。

public void run() {jump();System.out.println("正在执行run方法");
}

大部分时候,一个方法访问该类中定义的其他方法、成员变量时加不加 this 前缀的效果是完全一样的。

注意:对于 static 修饰的方法而言,可以使用类来直接调用该方法,如果在 static 修饰的方法中使用 this 关键字,则这个关键字就无法指向合适的对象。所以,static 修饰的方法中不能使用 this 引用。并且 Java 语法规定,静态成员不能直接访问非静态成员。

省略 this 前缀只是一种假象,虽然程序员省略了调用 jump() 方法之前的 this,但实际上这个 this 依然是存在的。

例2:

public class test {private String name; //成员属性//带参构造方法public test(String name){//调用本类setName方法this.setName(name);}public void setName(String name){this.name=name;}public void tell(){System.out.println("this.name:"+this.name);}public static void main(String[] args) {test Test=new test("之后");//实例化对象Test.tell();}
}

this( )访问构造方法

this( ) 用来访问本类的构造方法(构造方法是类的一种特殊方法,方法名称和类名相同,没有返回值。

例 1
下面定义一个 Student 类,使用 this( ) 调用构造方法给 name 赋值,Student 类的代码如下所示:

public class Student {String name;// 无参构造方法(没有参数的构造方法)public Student() {this("张三");}// 有参构造方法public Student(String name) {this.name = name;}// 输出name和agepublic void print() {System.out.println("姓名:" + name);}public static void main(String[] args) {Student stu = new Student();stu.print();}
}

输出结果为:

姓名:张三

例2:

public class test {private String name; //成员属性private int age;//无参构造函数public test(){System.out.println("test类  对象实例化");}//双参构造函数public test(String name,int age){this();//在双参构造函数里面调用无参函数//设置属性内容this.name=name;this.age=age;}public void say(){System.out.println(name+","+age);}public static void main(String[] args) {test Test=new test("张三",13);Test.say();}
}

运行结果:

test类  对象实例化
张三,13

注意:

  • this( ) 不能在普通方法中使用,只能写在构造方法中。
  • 在构造方法中使用时,必须是第一条语句。

使用this()实现构造方法的相互调用

public class test {private String name; //成员属性private int age;//无参构造函数public test(){System.out.println("test类  对象实例化");}//单参构造方法public test(String name){this();//调用无参构造函数this.name=name;}//双参构造函数public test(String name,int age){this(name);//调用单参构造函数this.age=age;}public void say(){System.out.println(name+","+age);}public static void main(String[] args) {test Test=new test("张三",13);Test.say();}
}

test类 对象实例化
张三,13

本程序定义了三个构造方法,并且这三个构造方法之间可以进行相互调用,即双参构造调用单参构造,单参构造调用无参构造,这样不管调用哪个构造方法都可以进行提示信息的输出

1.6 this关键字详解(3种用法)相关推荐

  1. C++/面试 - 四种类型转换(cast)的关键字 详解 及 代码

    四种类型转换(cast)的关键字 详解 及 代码 本文原创, 禁止转载, 如有需要, 请站内联系. 本文地址: http://blog.csdn.net/caroline_wendy/article/ ...

  2. Day16-01 P71 面向对象12什么是多态 P72 对象13:instanceof和类型转换 P73 static关键字详解 P74 抽象类 P75 接口的定义与实现 P76N种内部类

    Day16-01 P71 面向对象12:什么是多态 //父类Person package com.oop.demo06;public class Person {public void run(){S ...

  3. Java中的static关键字详解

    ** Java中的static关键字详解 ** 在一个类中定义一个方法为static,即静态的,那就是说无需本类的对象就可以调用此方法.调用一个静态方法就是 "类名.方法名" ,静 ...

  4. Delphi 关键字详解[整理于 橙子 的帖子]

    Delphi 关键字详解[整理于 "橙子" 的帖子] absolute //它使得你能够创建一个新变量, 并且该变量的起始地址与另一个变量相同. var Str: string[3 ...

  5. swift. 扩展类添加属性_swift中的声明关键字详解

    原起 学习swift,swift中的关键字当然要了解清楚了,最近在网上看到了关于声明关键字的文章,整理记录一下. 关键字是类似于标识符的保留字符序列,除非用重音符号(`)将其括起来,否则不能用作标识符 ...

  6. C#关键字详解第二节

    base:基类 在有些书中base的解释为表示父类,没错,base可以表示父类,但我更想理解成基类,因为更原始更具象,既然是类,那么他就符合面向对象的设计规则和特点,我们知道面向对象的三个特点是封装, ...

  7. C++ explicit关键字详解(用于构造函数)

    C++ explicit关键字详解(用于构造函数) C++提供了关键字explicit,可以阻止不应该允许的经过转换构造函数进行的隐式转换的发生.声明为explicit的构造函数不能在隐式转换中使用. ...

  8. Java关键字详解-配视频讲解链接(附带一些面试题)

    Java中常用的关键字详解-配视频讲解链接(附带一些面试题) 关键字:被Java赋予了特定含义的英文单词.关于关键字的学习贯穿了整个Java的学习,结合应用理解记忆关键字,不能单纯的死记硬背,在这里通 ...

  9. c语言中ANSI标准的关键字,C语言中32个关键字详解

    C语言中32个关键字详解 由 ANSI 标准定义的 C 语言关键字共32个,根据关键字的作用,可以将关键字分为数据类型关键字和流程控制关键字两大类. 一.数据类型关键字 A 基本数据类型(5个) vo ...

  10. 由ANSI标准定义的C语言关键字,C语言32个关键字详解

    C语言中32个关键字详解 由ANSI标准定义的C语言关键字共32个: auto double int struct break else long switch case enum register ...

最新文章

  1. R语言可视化包ggplot2移除(remove)可视化结果的图例(legend)实战
  2. Spring 基于xml配置方式的AOP
  3. mac安装opencv
  4. java程序_Java程序员必备----Java命令大全
  5. PHP中的__toString方法(实现JS里的链式操作)
  6. Python的特殊成员
  7. Asp.Net无刷新分页( jquery.pagination.js)
  8. 再谈javascript图片预加载技术(转)
  9. skyline 系列 1 - 简介、下载
  10. 智慧消防技术在安全管理中的应用
  11. 关于CCSP云安全专家考试你一定要知道的事!
  12. 数字孪生工厂解决方案,3DGIS+视频融合+时空位置智能(LI)技术
  13. JavaScript——DOM文档
  14. 里去频闪的插件叫什么_冬天去海南,你才会发现什么叫“不枉此生”!
  15. 全景制作教程:如何利用Pano2VR进行补天补地?
  16. 微信小程序标签页组件
  17. 【思维方法】之第一性原理
  18. 行为识别(Action Recognition)初探
  19. Kubernetes集群中部署Node节点
  20. python canopen_CAN与CANOPEN在电机控制中的应用

热门文章

  1. DayDayUp:寒门女孩考入北大→换角度看待表达《感谢贫穷》—关于吃苦与穷~~~Python之wordcloud词云图可视化
  2. hyperopt中文文档:Scipy2013
  3. Thread Group(线程组)
  4. PKG_CONFIG_PATH 、LD_LIBRARY_PATH、PATH三个的作用
  5. js格式化文件大小, 输出成带单位的字符串工具
  6. Silverlight 置于悬浮层之下 背景透明的方法
  7. VC里的集合类、链表类、映射类
  8. 在IAR下如何查看工程的堆栈(STM32)
  9. STM32学习笔记(三) STM32的GPIO的深入学习
  10. 渲染管道(3)几何阶段二“坐标转换”