首页 > 编程语言 >4.7 Java this关键字详解(3种用法)

4.7 Java this关键字详解(3种用法)

时间:2023-09-21 21:33:20浏览次数:51  
标签:4.7 Java name 构造方法 对象 Dog 详解 run 方法

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

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

this.属性名

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

例 1

假设有一个教师类 Teacher 的定义如下:
1 public class Teacher {
2 private String name; // 教师名称
3 private double salary; // 工资
4 private int age; // 年龄
5 }

 

在上述代码中 name、salary 和 age 的作用域是 private,因此在类外部无法对它们的值进行设置。为了解决这个问题,可以为 Teacher 类添加一个构造方法,然后在构造方法中传递参数进行修改。代码如下:
1 // 创建构造方法,为上面的3个属性赋初始值
2 public Teacher(String name,double salary,int age) {
3 this.name = name; // 设置教师名称
4 this.salary = salary; // 设置教师工资
5 this.age = age; // 设置教师年龄
6 }

 

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

创建一个 main() 方法对 Teacher 类进行测试,代码如下:
1 public static void main(String[] args) {
2 Teacher teacher = new Teacher("王刚",5000.0,45);
3 System.out.println("教师信息如下:");
4 System.out.println("教师名称:"+teacher.name+"\n教师工资:"+teacher.salary+"\n教师年龄:"+teacher.age);
5 }

 

运行该程序,输出的结果如下所示。
教师信息如下:
教师名称:王刚
教师工资:5000.0
教师年龄:45

 

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

this.方法名

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

例 2

假设定义了一个 Dog 类,这个 Dog 对象的 run( ) 方法需要调用它的 jump( ) 方法,Dog 类的代码如下所示:
 1 /**
 2 * 第一种定义Dog类方法
 3 **/
 4 public class Dog {
 5 // 定义一个jump()方法
 6 public void jump() {
 7 System.out.println("正在执行jump方法");
 8 }
 9 // 定义一个run()方法,run()方法需要借助jump()方法
10 public void run() {
11 Dog d = new Dog();
12 d.jump();
13 System.out.println("正在执行 run 方法");
14 }
15 }

 

使用这种方式来定义这个 Dog 类,确实可以实现在 run( ) 方法中调用 jump( ) 方法。下面再提供一个程序来创建 Dog 对象,并调用该对象的 run( ) 方法。
1 public class DogTest {
2 public static void main(String[] args) {
3 // 创建Dog对象
4 Dog dog = new Dog();
5 // 调用Dog对象的run()方法
6 dog.run();
7 }
8 }

 

在上面的程序中,一共产生了两个 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( ) 方法代码修改如下,其它代码不变。
1 /**
2 * 第二种定义Dog类方法
3 **/
4 // 定义一个run()方法,run()方法需要借助jump()方法
5 public void run() {
6 // 使用this引用调用run()方法的对象
7 this.jump();
8 System.out.println("正在执行run方法");
9 }

 

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

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

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

 

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

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

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

this( )访问构造方法

this( ) 用来访问本类的构造方法(构造方法是类的一种特殊方法,方法名称和类名相同,没有返回值。详细了解可参考《Java构造方法》一节),括号中可以有参数,如果有参数就是调用指定的有参构造方法。

例 3

下面定义一个 Student 类,使用 this( ) 调用构造方法给 name 赋值,Student 类的代码如下所示:
 1 public class Student {
 2 String name;
 3 // 无参构造方法(没有参数的构造方法)
 4 public Student() {
 5 this("张三");
 6 }
 7 // 有参构造方法
 8 public Student(String name) {
 9 this.name = name;
10 }
11 // 输出name和age
12 public void print() {
13 System.out.println("姓名:" + name);
14 }
15 public static void main(String[] args) {
16 Student stu = new Student();
17 stu.print();
18 }
19 }

 

输出结果为:
姓名:张三

 

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

标签:4.7,Java,name,构造方法,对象,Dog,详解,run,方法
From: https://www.cnblogs.com/szmtjs10/p/17721016.html

相关文章

  • java8 新特性之日期时间处理 LocatDate、LocalTime、LocalDateTime、ZonedDateTime、D
    一、LocalDate、LocalTime、LocalDateTime和常用API1、LocalDatepublicvoidtest01(){//1.创建指定的日期LocalDatedate1=LocalDate.of(2021,05,06);System.out.println("date1="+date1);//2.得到当前的日期LocalDate......
  • java基础-IO流-day13
    目录1.IO的概念IO流的分类2.一个一个字符完成文件的复制3.非文本读取与复制1.IO的概念计算机内存中的数据<-->硬盘里面的数据也就是数据的落盘以及数据的读取文件的操作packagecom.msb.io01;importjava.io.File;importjava.io.IOException;/***@Auther......
  • Java中print和println的区别
    Java中print()和println()的区别区别是print()输出完毕之后不换行,而println()输出完毕后会换行,所以println()在不输出任何东西的时候,就只输出一个换行符。示例如下:System.out.println("a");System.out.print("b");System.out.print("c");控制台输出结果:abc......
  • 无涯教程-JavaScript - F.INV函数
    描述F.INV函数返回F概率分布的倒数。如果p=F.DIST(x...),则F.INV(p...)=x。F分布可用于比较两个数据集变异程度的F检验。语法F.INV(probability,deg_freedom1,deg_freedom2)争论Argument描述Required/OptionalProbabilityAprobabilityassociatedwiththeF......
  • java中:idea开发环境下如何对5位数进行排序
    问题如何随机输入5位数,并对其进行排序,有序输出步骤打开idea,找到上方菜单栏中的file,按顺序file-new-project,新建工程文件。在建立好的工程文件的src文件下,新建类,最后输入代码图例如下代码如下publicclassDifferentFive{//随机输入5个不同的数字,使用程序将其有序输出pub......
  • 关于hive中的com.google.common.base.Preconditions.checkArgument(ZLjava/lang/Strin
    com.google.common.base.Preconditions.checkArgument(ZLjava/lang/String;Ljava/lang/Object;)V这个报错是因为Hive 3.1.3guava19.jar和hadoop3.2.4不兼容导致 解决方法—— 之后hive就可以正常初始化了  参考博客——https://blog.csdn.net/happyfreeangel/ar......
  • 无涯教程-JavaScript - FISHER函数
    描述FISHER函数返回x处的Fisher变换。这种转换产生的功能通常呈正态分布而不是倾斜。使用此功能对相关系数执行假设检验。语法FISHER(x)争论Argument描述Required/OptionalXAnumericvalueforwhichyouwantthetransformation.RequiredNotesFisher变换的等......
  • 初识Java
    前言Java语言是一种广泛使用的面向对象编程语言,它具有简单、面向对象、分布式、解释执行、健壮安全等特点。Java语言可以在不同的平台上编写一次,然后在其他平台上运行。在这篇文章中,我们将对Java编程进行初步探讨。摘要Java是一种跨平台的编程语言,可以在不同的操作系统上运行。......
  • 基于Java面向对象思想对个人项目的深度分析
    基于Java面向对象思想对个人项目的深度分析一、摘要本文站在java面向对象思想的角度,深入研究了GJH同学Java中小学数学卷子自动生成程序的工程代码。通过对核心类、继承与多态、封装与解耦等面向对象思想和生成题目算法进行了深度分析,全面探讨了系统的优缺点与改进空间。关键字:j......
  • 携程ASE加密解密 java python
    java代码packagecom.example.trip_vip;importcom.alibaba.fastjson.JSON;importcom.alibaba.fastjson.JSONObject;importjavax.crypto.Cipher;importjavax.crypto.spec.IvParameterSpec;importjavax.crypto.spec.SecretKeySpec;importjava.io.UnsupportedEncod......