Java中的this关键字

简介: Java中的this关键字

介绍

this关键字用于引用当前实例,在Java语言中,当创建一个对象后,Java虚拟机就会为其分配一个指向对象本身的指针,这个指针就是“this”。


Java关键字this只能用于方法方法体内,在类中的非静态方法中使用,静态方法和静态的代码块中绝对不能出现this,并且this只和特定的对象关联,而不和类关联,同一个类的不同对象有不同的this。


在《Java编程思想》第四版第五章5.4⼩节对 this 关键字是这样介绍的:


this 关键字只能在⽅法内部使⽤,表示对“调⽤⽅法的那个对象”的引⽤。


应用

this关键字主要有三个应用:

(1)this调用本类中的属性,也就是类中的成员变量;

(2)this调用本类中的其他方法;

(3)this调用本类中的其他构造方法,调用时要放在构造方法的首行。


(1)调用成员变量

public class day13_2 {

   public static void main(String[] args){

       MyPerson p = new MyPerson();

       p.name = "小白";

       System.out.println("应该是小白:"+p.name);

       p.setName("小明");

       System.out.println("应该是小明:"+p.name);

   }

}

class MyPerson {  

   String name;   //直接在类中定义变量,表示类具有的属性

   void setName(String name){

       name = name;

       //出现重名时,优先使用作用域最接近的,

       // 这里实际上是将方法参数的局部变量name赋值为本身

   }

}

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

运行结果如下:

微信图片_20230701141808.png


很明显,对象p的name属性在使用setName()后,并没有达到想要的修改的效果。


这是因为什么呢? 因为此时操作的name实际上是方法中的,与类中的属性完全没有关系。


代码中,有成员变量name,有方法的形参name,然后在方法中将形参name的值传递给成员变量name,当然,我们是一定懂这个逻辑的,但是java编译器要如何判断使用哪一个变量呢?是将形参name的值传递给成员变量name,还是反过来讲成员变量name的值传递给形参name呢?


当出现重名的时候,因为默认情况下会优先使用作用域最近的变量,如何才能表示用使用的变量是类的成员变量呢?


p.name = "小白";

System.out.println("应该是小白:"+p.name);

也可以看到,上面在使用这两句时,通过"对象.属性"的形式访问到了当前对象p的属性name

1

2

3

那么,如果我们想要在方法内访问当前对象的属性,便可以使用this关键字,来明确表示当前类的示例对象本身:也就是说,使用this关键字代表的就是类中的成员变量,又叫做类的属性


void setName(String name){

       this.name = name; //让当前对象的name变量值等于参数传入的值

   }

1

2

3

这样就可以修改成功了,当然,如果方法内没有变量出现重名的情况,那么默认情况下可以不使用this关键字来明确表示当前对象:


String getName() {

   return name;    //这里没有使用this,但是当前作用域下只有对象属性的name变量,所以说直接就使用了

}

1

2

3

上面举的例子是以形参为例,其实如果是局部变量的话,也是相同的道理。


在方法体内定义的变量称为局部变量,在类的内部 方法体的外部定义的变量称为成员变量,


若方法中的局部变量与成员变量名字相同时,那么**在方法中成员变量将会被屏蔽**。


若此时仍要使用成员变量,就需要使用关键字this:this.成员变量名


(2)调用本类中的其他方法

如上所述,既然**this可以调动本类中的成员变量,那么,也就可以调动本类中的成员方法**


public class day13_2 {

   public static void main(String[] args){

       MyPerson p = new MyPerson();

       p.setName("小明");

       System.out.println("应该是小明:"+p.name);

   }

}

class MyPerson {  

   String name;   //直接在类中定义变量,表示类具有的属性

 

   void setName(String name){

       this.name = name;

       this.print();   //调用本类中的print()方法

   }

   void print(){

       System.out.println("完成设置");

   }

}

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

运行结果如下:

微信图片_20230701141838.png


一般在java中引用成员变量或成员方法都是以对象名.成员变量或者对象名.成员方法的形式.


不过在没有相同变量的时候,也可以使用this.成员变量的形式来引用变量 。


这主要是从便于代码的阅读考虑。看到this关键字就知道现在引用的变量是成员变量或者成员方法,而不是局部变量。这无形中就提高了代码的阅读性。


(3)调用类的构造方法

Java类中,构造方法无需写返回值,且方法名称与类名相同,在Java类中必须存在一个构造方法。


若在代码中没有显式的构造方法,那么编译器在编译时会自动添加一个没有形参的构造方法。


一个类中可以存在多个构造方法,这些构造方法都用相同的名字,只是形参不同,Java语言会根据传入参数来判断调用哪一个构造方法。


当一个类中有多个构造方法时,可以利用this关键字相互调用。


public class day13_2 {

   public static void main(String[] args){

       MyPerson p = new MyPerson();

       System.out.println("名字是韩梅梅:"+p.name+"\n年龄是12:"+p.age);

   }

}

class MyPerson {   //这里定义的人类具有三个属性,名字、年龄、性别

   String name;   //直接在类中定义变量,表示类具有的属性

   int age;

   String sex;

   MyPerson(){

       this("韩梅梅",12);//调用有两个参数的构造方法

       System.out.println("无参构造函数  调用  两个参的构造函数");

   }

   MyPerson(String name,int age){

       this(name);

       System.out.println("两个参的构造函数  调用  一个参构造函数");

       this.age = age;

   }

   MyPerson(String name){

       this.name = name;

   }

}

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

运行结果如下:

微信图片_20230701141857.png

在使用this关键字调用其他构造方法的时候,this()调用构造方法只能放在构造方法的首行,为的是能够为类中的属性初始化;


而且至少有一个构造方法是不用this调用,否则程序会出现错误。


//如果上述代码中,一个参数的构造函数,也用this调用其它构造函数

   MyPerson(String name){

       this();

   }

//这时候构造方法就出现了递归调用,程序出错。

1

2

3

4

5

注意的是,使用this调用构造方法只适用于构造方法的调用,类中的其他方法不能使用这种方法。


(4)返回对象的值★

this最重要的特点就是表示当前对象:java中当前对象就是指当前正在调用类中方法的对象。


使用this引用当前对象是指**如果在类的方法中需要返回一个对象,并且该对象是方法所在的类的当前对象**,可以使用this关键字作为方法的返回值。


**注意:**这种用法如果在内部类中使用,可能会导致结果与预期不一致,因为this将代表内部类的实例而不是外部类的实例。


class Test2 {

   String s="";

   public static void main(String[] args) {

       Test2 t = new Test2();

       t.method("111");

       t.method("222");

       t.method("333");

       t.method2();

   }

   public Test2 method(String str) {

       s+=str;

       return this;  //return this; 语句一般都是用在类中非静态方法的末尾

   }

   public void method2() {

       System.out.println(s);

   }

}

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

运行结果如下:

微信图片_20230701141916.png


其实,可以将上述代码的逻辑理解为t.method("111").method("222").method("333");


return this; 语句一般都是用在类中非静态方法的末尾。在java中类的非静态方法是属于对象的,this则代表当前这个非静态方法属于的对象,并且是当前类的对象。


day13 HJ48从单向链表中删除指定值的节点(Java)这篇文章中便使用到了return this的语句,可以通过这道算法题更直观的去理解知识点

扩展—— 讲一下对象的使用

我们使用一个变量来指代某对象,而引用类型的变量,存储的是对象的引用


public static void main(String[] args) {

   Person p1 = new Person();

   Person p2 = p1;

}

1

2

3

4

上面的代码将变量p2赋值为p1的值,那么实际上只是传递了对象的引用,而不是对象本身的复制

微信图片_20230701141932.png



public class day13_1 {

   public static void main(String[] args) {

       Person p1 = new Person();

       Person p2 = p1;

       p1.name = "小明";  

       System.out.printlnp1.name=:"+p1.name);

       p2.name = "大明";  

       System.out.println("p1.name=:"+p1.name);  

       System.out.println("p2.name=:"+p2.name);

       System.out.println("p1.name=:"+p1.name);

   }

}

class Person {   //这里定义的人类具有三个属性,名字、年龄、性别

   String name;   //直接在类中定义变量,表示类具有的属性

   int age;

   String sex;

}

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17


微信图片_20230701141950.png

由运行结果,就可以很直白的看出,p1和p2保存的是同一个对象的引用,通过其中一个修改,另一个读取时也会得到修改后的答案


相关文章
|
2月前
|
Java
Java关键字 —— super 详细解释!一看就懂 有代码实例运行!
文章详细解释了Java关键字`super`的用途,包括访问父类的成员变量、调用父类的构造方法和方法,并提供了相应的代码实例。
158 5
Java关键字 —— super 详细解释!一看就懂 有代码实例运行!
|
4月前
|
Java 开发者 UED
【实战宝典】Java异常处理大师级教程:throws关键字,让异常声明成为你的专属标签!
【实战宝典】Java异常处理大师级教程:throws关键字,让异常声明成为你的专属标签!
69 3
|
1月前
|
JavaScript 前端开发 Java
java中的this关键字
欢迎来到我的博客,我是瑞雨溪,一名热爱JavaScript与Vue的大一学生。自学前端2年半,正向全栈进发。若我的文章对你有帮助,欢迎关注,持续更新中!🎉🎉🎉
50 9
|
1月前
|
设计模式 JavaScript 前端开发
java中的static关键字
欢迎来到瑞雨溪的博客,博主是一名热爱JavaScript和Vue的大一学生,致力于全栈开发。如果你从我的文章中受益,欢迎关注我,将持续分享更多优质内容。你的支持是我前进的动力!🎉🎉🎉
51 8
|
1月前
|
Java 开发者
在Java多线程编程的世界里,Lock接口正逐渐成为高手们的首选,取代了传统的synchronized关键字
在Java多线程编程的世界里,Lock接口正逐渐成为高手们的首选,取代了传统的synchronized关键字
46 4
|
2月前
|
Java 程序员
在Java编程中,关键字不仅是简单的词汇,更是赋予代码强大功能的“魔法咒语”。
【10月更文挑战第13天】在Java编程中,关键字不仅是简单的词汇,更是赋予代码强大功能的“魔法咒语”。本文介绍了Java关键字的基本概念及其重要性,并通过定义类和对象、控制流程、访问修饰符等示例,展示了关键字的实际应用。掌握这些关键字,是成为优秀Java程序员的基础。
28 3
|
2月前
|
算法 Java
在Java编程中,关键字和保留字是基础且重要的组成部分,正确理解和使用它们
【10月更文挑战第13天】在Java编程中,关键字和保留字是基础且重要的组成部分。正确理解和使用它们,如class、int、for、while等,不仅能够避免语法错误,还能提升代码的可读性和执行效率。本指南将通过解答常见问题,帮助你掌握Java关键字的正确使用方法,以及如何避免误用保留字,使你的代码更加高效流畅。
39 3
|
2月前
|
存储 安全 Java
了解final关键字在Java并发编程领域的作用吗?
在Java并发编程中,`final`关键字不仅用于修饰变量、方法和类,还在多线程环境中确保对象状态的可见性和不变性。本文深入探讨了`final`关键字的作用,特别是其在final域重排序规则中的应用,以及如何防止对象的“部分创建”问题,确保线程安全。通过具体示例,文章详细解析了final域的写入和读取操作的重排序规则,以及这些规则在不同处理器上的实现差异。
了解final关键字在Java并发编程领域的作用吗?
|
2月前
|
Java 编译器
在Java中,关于final、static关键字与方法的重写和继承【易错点】
在Java中,关于final、static关键字与方法的重写和继承【易错点】
28 5
|
2月前
|
Java 开发者
在 Java 多线程编程中,Lock 接口正逐渐取代传统的 `synchronized` 关键字,成为高手们的首选
【10月更文挑战第6天】在 Java 多线程编程中,Lock 接口正逐渐取代传统的 `synchronized` 关键字,成为高手们的首选。相比 `synchronized`,Lock 提供了更灵活强大的线程同步机制,包括可中断等待、超时等待、重入锁及读写锁等高级特性,极大提升了多线程应用的性能和可靠性。通过示例对比,可以看出 Lock 接口通过 `lock()` 和 `unlock()` 明确管理锁的获取和释放,避免死锁风险,并支持公平锁选择和条件变量,使其在高并发场景下更具优势。掌握 Lock 接口将助力开发者构建更高效、可靠的多线程应用。
28 2
下一篇
DataWorks