this关键字详解

 更新时间:2019年03月20日 11:20:41   作者:冰湖一角  
这篇文章主要介绍了this关键字,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

Java提供了一个this关键字,this关键字总是指向调用该方法的对象。根据this出现的位置的不同,this作为对象的默认引用有两种情形。

1)构造器中引用该构造器正在初始化的对象。

2)在方法中引用调用该方法的对象。

this关键字最大的作用就是让类中一个方法,访问该类里的另一个方法或者实例变量。假设定义了一个Person类,这个Person对象的eat()方法需要调用它的move()方法,则如何做呢?是否应该定义如下的Person类呢?

public class Person {
    
    //定义一个move()方法
    public void move(){
      System.out.println("正在执行move()方法");
    }
    //定义一个eat()方法,eat()方法需要借助move()方法
    public void eat(){
      Person p = new Person();
      p.move();
      System.out.println("正在执行eat()方法");
    }
    
    public static void main(String[] args) {
      //创建Person对象
      Person p = new Person();
      //调用Person的eat()方法
      p.eat();
    }
  }

运行结果为:

正在执行move()方法
正在执行eat()方法

以上这种方式确实能够做到在eat()方法里调用move()方法,但从main()方法里的程序中可以看出,一共创建了两个对象:main()方法里创建一个对象;eat()方法里创建一个对象。可是真的需要创建两个对象吗?答案是否定的!因为当程序调用eat()方法时一定会提供一个Person对象,而不需要重新创建一个Person对象了。

因此需要在eat()方法中获得调用该方法的对象,通过this关键字就可以满足这个需求。

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

将上面的Person类中的eat()方法改为一下这种方式更合适:

//定义一个eat()方法,eat()方法需要借助move()方法
public void eat(){
  //使用this引用调用eat()方法的对象
  this.move();
  System.out.println("正在执行eat()方法");
}

上述程序中eat()方法需要依赖于move()方法,现实中这种依赖情形非常常见,例如写字方法需要拿笔的方法,这种依赖都是同一个对象两个方法之间的依赖。因此,Java允许对象的的一个成员直接调用另一成员,可以省略this前缀。也就是说,上面的程序可以改为如下形式:

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

另外一种情形是:this关键字可用于构造器中作为默认引用,由于构造器是直接使用new关键字来调用,而不是使用对象来调用的,所以this在构造器中代表该构造器正在初始化的对象。例如下面的程序:

public class Person {
    //定义一个名为age的成员变量
    public int age;
    
    //构造器
    public Person() {
      //在构造器里定义一个age变量
      int age = 0;
      //使用this代表该构造器正在初始化的对象
      //下面的代码将会把该构造器正在初始化的对象的age成员变量设为3
      this.age = 3;
    }


    public static void main(String[] args) {
      //使用new Person()创建的对象的age成员变量都将被设为3
      //下面代码输出3
      System.out.println(new Person().age);
    }
  }

与普通方法类似的是,大部分时候,在构造器中访问其它成员变量和方法时都可以省略this前缀,但如果构造器中有一个与成员变量同名的局部变量,又必须在构造器中访问这个被覆盖的成员变量,则必须使用this前缀。如上面程序所示。

当this作为对象的默认引用使用时,程序可以像访问普通引用变量一样来访问这个this引用,甚至可以把this当成普通方法的返回值。请看下面程序:

public class Person {
    public int age;
    
    public Person grow() {
      age ++;
      return this;
    }

    public static void main(String[] args) {
      Person p = new Person();
      //可以连续调用同一个方法
      p.grow().grow().grow();
      System.out.println("p对象的age的值是:"+p.age);
    }
  }

运行结果为:

p对象的age的值是:3

从上面的程序可以看出,如果在某个方法中把this作为返回值,则可以多次连续调用同一个方法,从而使得代码更加的简洁。但这种方式容易造成实际意义的模糊,例如上面的group()方法,用于表示对象的生长,即age变量的值加1,实际上不应该有返回值。

最后需要强调一点:静态成员不能直接访问非静态成员,即static修饰的方法不能访问不适用static修饰的普通方法。对于static修饰的方法而言,可以使用类直接调用该方法,如果在static修饰的方法中使用this关键字,则这个关键字就无法指向合适的对象。所以,static修饰的方法中不能使用this引用。

以上所述是小编给大家介绍的this关键字详解整合,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持!

相关文章

  • 基于@Bean修饰的方法参数的注入方式

    基于@Bean修饰的方法参数的注入方式

    这篇文章主要介绍了@Bean修饰的方法参数的注入方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-09-09
  • 浅谈java实现重载的方法

    浅谈java实现重载的方法

    方法重载是让类以统一的方式处理不同类型数据的一种手段。多个同名函数同时存在,具有不同的参数个数/类型。重载Overloading是一个类中多态性的一种表现。Java的方法重载,就是在类中可以创建多个方法,它们具有相同的名字,但具有不同的参数和不同的定义。
    2015-09-09
  • SpringBoot实现文件在线预览功能的全过程

    SpringBoot实现文件在线预览功能的全过程

    我们开发业务系统的时候,经常有那种文档文件在线预览的需求,下面这篇文章主要给大家介绍了关于SpringBoot实现文件在线预览功能的相关资料,需要的朋友可以参考下
    2021-11-11
  • SpringBoot使用Hibernate拦截器实现时间自动注入的操作代码

    SpringBoot使用Hibernate拦截器实现时间自动注入的操作代码

    这篇文章主要介绍了SpringBoot使用Hibernate拦截器实现时间自动注入的操作代码,主要包括hibernate拦截器的相关知识,结合实例代码给大家讲解的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-10-10
  • Java 8 Function函数式接口及函数式接口实例

    Java 8 Function函数式接口及函数式接口实例

    函数式接口(Functional Interface)就是一个有且仅有一个抽象方法,但是可以有多个非抽象方法的接口。接下来通过本文给大家介绍Java 8 Function函数式接口及函数式接口实例代码,需要的朋友可以参考下
    2018-05-05
  • IntelliJ IDEA窗口组件具体操作方法

    IntelliJ IDEA窗口组件具体操作方法

    IDEA刚接触不久,各种常用工具窗口找不到,不小心关掉不知道从哪里打开,今天小编给大家分享这个问题的解决方法,感兴趣的朋友一起看看吧
    2021-09-09
  • springboot整合nacos,如何读取nacos配置文件

    springboot整合nacos,如何读取nacos配置文件

    这篇文章主要介绍了springboot整合nacos,如何读取nacos配置文件问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-11-11
  • Spring Security用户定义 

    Spring Security用户定义 

    这篇文章主要介绍了Spring Security用户定义,大家都知道 Spring Security的用户定义有很多方式,其实主要有两种,基于内存的和基于数据库的,下面我给大家简单介绍一下这两种方式,需要的朋友可以参考下
    2022-02-02
  • Java NIO 中Buffer 缓冲区解析

    Java NIO 中Buffer 缓冲区解析

    这篇文章主要介绍了Java NIO 中Buffer 缓冲区,Java NIO 中的 Buffer 用于和 NIO 通道进行交互。数据是通道读取到缓冲区,从缓冲区写入到通道中的。下面内容希望帮助带大家理解
    2022-02-02
  • java设计模式学习之代理模式

    java设计模式学习之代理模式

    这篇文章主要为大家详细介绍了java设计模式学习之代理模式的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-10-10

最新评论