theboyaply

学,就硬学!

  • Home
  • Archives
  • Java
  • Maven
  • Docker
  • Kubernetes
  • JavaScript
  • ES6
  • Vue
  • 踩坑记录
  • noted

  • 搜索
element ui vue wsimport webservice npm mysql redis node nginx nfs ftp es6 开发工具 vscode 前端 javascript springboot 常见问题 tomcat oracle jenkins maven k8s Linux gitlab docker java

java基础十(this关键字)

发表于 2020-01-13 | 分类于 Java | 0 | 阅读次数 688

引用:

Java中this关键字使用小结

我们经常在类的getter、setter方法和构造器中见到this关键字。为什么this关键字常用在这里面呢?其实getter、setter等很多地方不用this关键字也是可以的,下面介绍下我理解中的this关键字。

this关键字是什么

当一个对象创建后,Java虚拟机(JVM)就会给这个对象分配一个引用自身的指针,这个指针的名字就是 this。因此,this只能在类中的非静态成员中使用,静态方法和静态的代码块中绝对不能出现this。并且this只和特定的对象关联,而不和类关联,同一个类的不同对象有不同的this。

通俗来讲,就是谁代表这个对象,this就代表谁。

public class TestClazz {
    public static void main(String[] args) {
        Demo demo = new Demo();
        // 是demo调用了getName()方法,因此getName()方法中的this代表demo
        String name = demo.getName();
    }
}

class Demo {
    private String name;
    
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

文章开头我们提到getter和setter方法中不用this也是可以的,但是前提是方法的形参不能和成员变量相同。

class Demo {
    private String name;

    public String getName() {
        return name;
    }
    
    public void setName(String paramName) {
        // 这里的paramName指的是方法的参数,name则指向类的成员变量。将paramName赋给name
        name = paramName;
    }

    public void setName2(String name) {
        // 如果参数名称与成员变量相同,则在该方法内,所有name都指的是该方法的参数name。因此这种方法赋值是不成功的。
        name = name;
        // 所以需要加上this关键字来表示给成员变量name赋值
        this.name = name;
    }
}

1. 使用this来区分当前对象

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

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

  • 方法中指调用该方法的对象;

  • 在类本身的方法或构造器中引用该类的实例变量(全局变量)和方法。this只能用在构造器或者方法中,用于获得调用当前的构造器方法的对象引用。可以和任何的对象引用一样来处理这个this对象。

说明:

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

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

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

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

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

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

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

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

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

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

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

# java
java基础十(值传递)
centos7搭建gitlab私有仓库
  • 文章目录
  • 站点概览
theboyaply

theboyaply

好记性不如烂笔头

184 日志
13 分类
27 标签
Github E-mail
Creative Commons
0%
© 2019 — 2023 theboyaply
由 Halo 强力驱动
|
主题 - NexT.Gemini
湘ICP备19009291号

湘公网安备 43312402001034号