当一个对象创建后,Java虚拟机(JVM)就会给这个对象分配一个引用自身的指针,这个指针的名字就是 this。

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

1、  使用this来区分当前对象。

Java中为解决变量的命名冲突和不确定性问题,引入关键字this代表其所在方法的当前对象的引用:

1)  构造方法中指该构造器所创建的新对象;

2)  方法中指调用该方法的对象;

3)  在类本身的方法或构造器中引用该类的实例变量(全局变量)和方法。

this只能用在构造器或者方法中,用于获得调用当前的构造器方法的对象引用。可以和任何的对象引用一样来处理这个this对象。

说明:

(1)当实例变量和局部变量重名,JAVA平台会按照先局部变量、后实例变量的顺序寻找。即,方法中使用到的变量的寻找规律是先找局部变量,再找实例变量。如果没用找到,将会有一个编译错误而无法通过编译。

(2)如果使用this.a,则不会在方法(局部变量)中寻找变量a,而是直接去实例变量中去寻找,如果寻找不到,则会有一个编译错误。

(3)在一个方法内,如果没有出现局部变量和实例变量重名的情况下,是否使用this关键字是没有区别的。

(4)在同一个类中,Java普通方法的互相调用可以省略this+点号,而直接使用方法名+参数。因为Java编译器会帮我们加上。

2、  在构造器中使用this来调用对象本身的其他构造器。

在构造器中使用this([args_list]);可以调用对象本身的其他的构造器。直接使用this()加上类构造器所需要的参数。就可以调用类本身的其他构造器了。如果类中有多个其他构造器定义,系统将自动根据this()中的参数个数和类型来找出类中相匹配的构造器。

注意:  在构造器中可以通过this()方式来调用其他的构造器。但在一个构造器中最多只能调用一个其他的构造器。并且,对其他构造器的调用动作必须放在构造器的起始处(也就是构造器的首行),否则编译的时候将会出现错误,另外不能在构造器以外的地方以这种方式调用构造器。

3、  this关键字还有一个重大的作用就是返回类的引用。如在代码中,可以使用return this来返回某个类的引用。此时,这个this关键字就代表类的名称。

例1. 把this作为参数传递

  当你要把自己作为参数传递给别的对象时,也可以用this。如:

public class A{

public A(){
new B(this).print();
} public void print(){
System.out.println("From A!");
} public static void main(String[] args) {
new A();
}
} public class B{
A a;
public B(A a){
this.a = a;
} public void print(){
a.print();
System.out.println("From B!");
}
}

运行结果:From A!

From B!

在这个例子中,对象A的构造函数中,用new B(this)把对象A自己作为参数传递给了对象B的构造函数。

例2. 注意匿名类和内部类中的中的this。

有时候,我们会用到一些内部类和匿名类,如事件处理。当在匿名类中出现this时,这个this则指的是匿名类或内部类本身。这时如果我们要使用外部类的方法和变量的话,则应该加上外部类的类名。如下面这个例子:

public class C {
int i = 1;
public C(){
Thread thread = new Thread(){
public void run(){
for(;;){//表示是死循环
C.this.run();//调用外部方法run()
try {
sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
};//注意这里有分号;
thread.start();
} public void run(){
System.out.println("i = " + i);
i++;
} public static void main(String[] args) throws Exception {
new C();
}
}

运行结果:每一秒产生一个数:1,2,3 ……

 在上面这个例子中, thread 是一个匿名类对象,在它的定义中,它的 run 函数里用到了外部类的 run 函数。这时由于函数同名,直接调用就不行了。这时有两种办法,一种就是把外部的 run 函数换一个名字,但这种办法对于一个开发到中途的应用来说是不可取的。那么就可以用这个例子中的办法用外部类的类名加上 this 引用来说明要调用的是外部类的方法 run。

例3、this关键字最大的作用是,让类的一个方法,访问该类的另一个方法或者属性。

先看一个不好的例子:

public class Baby{

   public void wakeUp(){
System.out.println("宝宝醒啦");
} public void eat(){
Baby baby = new Baby();
baby.wakeUp();
System.out.println("吃东西");
}
}

这样不符合逻辑。这就相当于本对象的eat方法,需要调用另一个对象的wakeUp方法。

我们看这个例子:

public class Baby{

   public void wakeUp(){
System.out.println("宝宝醒啦");
} public void eat(){
this.wakeUp();
System.out.println("吃东西");
}
}

这样就符合逻辑了。自己的eat方法,还需要自己的一个wakeUp方法。

java允许同一个对象的方法直接调用该对象的属性或者方法,所以this可以省略。

 

注意:java中为什么在static中不能使用this关键字

Static方法是类方法,先于任何的实例(对象)存在。即Static方法在类加载时就已经存在了,但是对象是在创建时才在内存中生成。而this指代的是当前的对象

在方法中定义使用的this关键字,它的值是当前对象的引用.也就是说你只能用它来调用属于当前对象的方法或者使用this处理方法中成员变量和局部变量重名的情况.

而且,更为重要的是this和super都无法出现在static 修饰的方法中,static 修饰的方法是属于类的,该方法的调用者可能是一个类,而不是对象.如果使用的是类来调用而不是对象,

则 this就无法指向合适的对象.所以static 修饰的方法中不能使用this.

Java中this关键字使用小结的更多相关文章

  1. 深入分析Java中的关键字static

    在平时开发当中,我们经常会遇见static关键字.这篇文章就把java中static关键字的使用方法的原理进行一个深入的分析.先给出这篇文章的大致脉络: 首先,描述了static关键字去修饰java类 ...

  2. Java中的关键字 transient

    先解释下Java中的对象序列化 在讨论transient之前,有必要先搞清楚Java中序列化的含义: Java中对象的序列化指的是将对象转换成以字节序列的形式来表示,这些字节序列包含了对象的数据和信息 ...

  3. 【转】java中volatile关键字的含义

    java中volatile关键字的含义   在java线程并发处理中,有一个关键字volatile的使用目前存在很大的混淆,以为使用这个关键字,在进行多线程并发处理的时候就可以万事大吉. Java语言 ...

  4. Java中native关键字

    Java中native关键字 标签: Java 2016-08-17 11:44 54551人阅读 评论(0) 顶(23453) 收藏(33546)   今日在hibernate源代码中遇到了nati ...

  5. Java复习笔记--java中this 关键字

    Java中this关键字,this可以调用类的成员变量和成员方法,this还可以调用类中的构造方法.使用这种方式值得注意的是, 只可以在无参构造方法中的第一句使用this关键字调用有参构造方法. pu ...

  6. Java中this关键字的使用

    本文介绍了在Java中this关键字的作用于使用方法 当局部变量和成员变量重名时,在方法中使用this时,表示的是该方法所在类中的成员变量.(this指的是当前对象自己) 如:public class ...

  7. Java中this关键字在构造方法中的使用

    1. Java中this关键字代表对象本身.用this关键字可以在类的内部调用属性和方法,这样代码的可读性比较高,因为它明确的指出了这个属性或方法的来源. 2. 同时在构造函数中也可以使用this关键 ...

  8. 慕课网-安卓工程师初养成-2-1 Java中的关键字

    来源:http://www.imooc.com/code/1176 Java 中常用关键字: 问:这么多,记不住啊......-_-|| 答:现在不需要你记住所有,混个眼熟即可,在学习的过程中,你会逐 ...

  9. 转:java中volatile关键字的含义

    转:java中volatile关键字的含义 在java线程并发处理中,有一个关键字volatile的使用目前存在很大的混淆,以为使用这个关键字,在进行多线程并发处理的时候就可以万事大吉. Java语言 ...

随机推荐

  1. C# 通过反射获取方法/类上的自定义特性

    1.所有自定义属性都必须继承System.Attribute 2.自定义属性的类名称必须为 XXXXAttribute 即是已Attribute结尾 自定义属性QuickWebApi [Attribu ...

  2. Spring与SpringMVC的关系

    在此鉴于你已经了解过Spring的相关知识,简单描述一下Spring与Spring的关系 在框架的使用中,Spring类似于一个具有多种特性,也可以说是多种功能模块的应用平台,(特性就比如IoC,AO ...

  3. hdu 1397 (素数判定)

    一开始提交了这个,果断TLE #include <cstdio> #include <iostream> #include <string> #include &l ...

  4. Struts2 (四) — 拦截器

    一.拦截器 1.概述 1.1什么是拦截器 ​ 在struts2中,拦截器(Interceptor)是用来动态拦截Action执行的对象. ​ 拦截器有点类似以前Servlet阶段的Filter(过滤器 ...

  5. bat批处理中如何获取前一天日期

    网上找了好久在批处理中生成前一日期的代码段 但网上找到的代码对 每个月的1号和每年的1号计算前一日期时,总会报错,然后要加很多的逻辑判断 想了想,可以用.net写个EXE程序,用.net实现获取前一日 ...

  6. 简单Json序列化和反序列化

    序列化是什么: 序列化就是将一个对象的状态(各个属性量)保存起来,然后在适当的时候再获得.序列化分为两大部分:序列化和反序列化.序列化是这个过程的第一部分,将数据分解成字节流,以便存储在文件中或在网络 ...

  7. js-99乘法表的练习

    <html> <head> <title>World</title> <style type="text/css"> & ...

  8. Win10安装docker步骤

    最近使用docker部署spring boot项目,写篇文章记录下步骤. 1. 确保本机win10系统虚拟化已启动启动,否则需要去BIOS设置(方法可百度) 2. 到docker网站下载DockerT ...

  9. window.addEventListener绑定事件记得删除

    在做postMessage通信时,window.addEventListener绑定的事件记得要remove掉 就和setTime一样,不然占用内存资源

  10. C# 读取excel用户列表过滤一个月内未收到外部邮件已离职的员工

    1.通过aspose.cells读取excel中的数据并添加到list中 //存储从excel中读取出来的数据 List<UserInfo> lst_userinfo = new List ...