前言


this关键字属于Java中比较复杂的关键字之一,若是学习过C++或者其他的一些面向对象语言也会遇到this这个关键字并且都会看到this的含义就是表示当前对象。什么叫做表示当前对象?this在Java中的用法是怎样的呢?将分为下面几点介绍。

  • this调用属性
  • this调用方法
  • this表示当前对象

this调用属性


当我们写参构造函数时,会倾向于将形参名取与将要赋值的属性名相同,这样就更容易看见形参就知道它是给哪个属性赋值。

class Student{
private String name;
private int age;
public Student(String name, int age){
}
}

在构造函数中赋值的时候,会很容易写成下面这样:

class Student{
private String name;
private int age;
public Student(String name, int age){
name = name;
age = age;
}
}

若写成这样,当构造Student这个对象并输出该对象的姓名和年龄时会发现,name为null, age为0。

造成这样的原因是因为有局部可见性。通常使用{}括起来的一个数据块叫做一个作用域范围。在同一个作用域范围定义了两个同名的变量则会报错;若是在该作用域定义了一个与该作用域范围之外同名的变量则是可以的,在这个作用域同时使用这两个变量,则在这个作用域中定义的变量会屏蔽作用域范围之外的那个变量,即作用域中定义的变量才会有效。

这样说完感觉有点绕。一句话来说,在同一作用域内,作用范围小的变量会屏蔽同名的作用范围大的变量。

若是想要Student类中的属性可以被正确初始化,那么则需要使用this关键字。

class Student{
private String name;
private int age;
public Student(String name, int age){
this.name = name;
this.age = age;
}
}

在我们编程时,访问类的属性最好使用this。

this调用方法


this不仅可以调用类中的属性还可以调用类中的方法。

类中的方法有普通方法和构造方法。

  1. 在本类的普通函数中调用其他普通函数,可以在函数前面加上this也可以不加,但是为了代码严谨性推荐加上this。

  2. 普通方法中不可以调用构造函数,构造函数的调用只能出现在第一次创建对象为对象进行初始化时调用!

  3. 在构造函数中调用普通方法,一般不推荐调用在方法内部使用了属性的普通方法。因为构造函数还没有执行完,属性没有被完全初始化,这时使用属性可能会出现异常。

  4. 构造函数之间可以相互调用,构造函数之间相互调用就一定需要使用this关键字!

    使用this()表示调用无参构造函数,this(参数,...)表示调用有参构造函数

public class Student{
private String name = null;
private int age = 0;
public Student() {
System.out.println("Student():name="+name+",age="+age);
}
public Student(String name, int age) {
this(); //若使用Student()则会报错:没有定义这个方法。被当做普通方法来解释
this.name = name;
this.age = age;
System.out.println("Student(String name, int age):name="+name+",age="+age);
}
public static void main(String[] args) {
Student stu = new Student("Sakura",20);
}
}
/*
output:
Student():name=null,age=0
Student(String name, int age):name=Sakura,age=20
*/

构造函数之间为什么要相互调用呢?

因为要减少构造函数中代码的重复问题,提高代码的重用性。所以,构造函数之间相互可以调用也就理所当然了。

构造函数之间相互调用有一些限制需要注意:

  • this()或者this(参数,...)需要被放在构造函数内部的首行
  • 进行构造方法相互调用的时候,一定要保留调用的出口!

    至少保留相互调用之间的一个构造函数没有使用this调用其他构造函数,此构造函数作为出口。避免递归调用!

this表示当前对象


我们需要知道同一个类的对象它们的属性是属于不同空间的,但是这些对象是共享类中的方法。所以它们需要一种方式表明是它们自己在调用该方法而不是其他的对象。
所以,当对象调用方法时,该对象会作为一个隐含实参传入到非静态方法中,在非静态方法中使用this来指向它,表明是它在调用该方法。

查看下面例子,可以发现this就是指向的是当前正在调用类中方法的对象。
![](https://img2018.cnblogs.com/blog/1099419/201811/1099419-20181119095016951-783364698.png)

所以前面使用this.属性也就很容易理解了,就是当前对象的属性。

小结


介绍了Java中this主要使用的三个方面:①类中的属性调用要加上this:this。属性的方式。②this用来构造函数之间的相互调用,一定要保留调用出口③this表示当前对象,指的是当前正在调用类方法的对象。

Java——this关键字的更多相关文章

  1. Java 并发 关键字volatile

    Java 并发 关键字volatile @author ixenos volatile只是保证了共享变量的可见性,不保证同步操作的原子性 同步块 和 volatile 关键字机制 synchroniz ...

  2. 【转载】java final 关键字的几种用法

    原文链接点这里,感谢博主分享 在java的关键字中,static和final是两个我们必须掌握的关键字.不同于其他关键字,他们都有多种用法,而且在一定环境下使用,可以提高程序的运行性能,优化程序的结构 ...

  3. 【转载】java static 关键字的四种用法

    原文链接点这里,感谢博主分享 在java的关键字中,static和final是两个我们必须掌握的关键字.不同于其他关键字,他们都有多种用法,而且在一定环境下使用,可以提高程序的运行性能,优化程序的结构 ...

  4. [java]final关键字的几种用法

    在java的关键字中,static和final是两个我们必须掌握的关键字.不同于其他关键字,他们都有多种用法,而且在一定环境下使用,可以提高程序的运行性能,优化程序的结构.下面我们来了解一下final ...

  5. [java]static关键字的四种用法

    在java的关键字中,static和final是两个我们必须掌握的关键字.不同于其他关键字,他们都有多种用法,而且在一定环境下使用,可以提高程序的运行性能,优化程序的结构.下面我们先来了解一下stat ...

  6. [Java并发编程(三)] Java volatile 关键字介绍

    [Java并发编程(三)] Java volatile 关键字介绍 摘要 Java volatile 关键字是用来标记 Java 变量,并表示变量 "存储于主内存中" .更准确的说 ...

  7. java的关键字与保留字

    1,Java 关键字列表 (依字母排序 共50组): abstract, assert, boolean, break, byte, case, catch, char, class, const(保 ...

  8. 深入java final关键字

    Java final关键字详解:https://blog.csdn.net/kuangay/article/details/81509164 深入java final关键字 用法注意点和JVM对其进行 ...

  9. Java Synchronized 关键字

    本文内容 Synchronized 关键字 示例 Synchronized 方法 内部锁(Intrinsic Locks)和 Synchronization 参考资料 下载 Demo Synchron ...

  10. java transient关键字作用,使用场景。

    java transient关键字作用,使用场景. 2016年08月31日 15:31:10 阅读数:4280 transient的作用及使用方法,官方解释为: Variables may be ma ...

随机推荐

  1. [转]构建高性能MySQL体系

    来源:http://www.yunweipai.com/archives/21232.html 构建高性能MySQL系统涵盖从单机.硬件.OS.文件系统.内存到MySQL 本身的配置,以及schema ...

  2. 网页偶现性崩溃-chrome

    简介: 项目前台框架:Angular2 + Bootstrap(日期等组件) + Echarts + 响应式(包括页面.字体缩放:rem) chrome版本:多个版本测试均有此问题. 表现: 订单详情 ...

  3. 代码图片转文本--阿里VS度娘

    最近看vue的书,居然没有提供源代码,一堆的CSS真不想手工录入,于是用手机找APP去转.发现广告普遍,于是找找网上相关的API,结果百度和阿里都有在线的API提供,于是好奇其能力如何.如于用以下两图 ...

  4. Windows服务器开发和Linux服务器软件开发的区别

    大型网页游戏服务器开发(Windows+Linux) 进程监听 负载均衡 数据库分发 MapGIS IGServer(Java C++)

  5. 默认空间和webapps下项目部署

    用eclipse默认的工作区和webapps的细节 用{WORKSPACE}表示你的eclipse的工作空间根目录,然后你打开 {WORKSPACE}\.metadata\.plugins\org.e ...

  6. U-Boot Makefile分析(4)具体子Makefile的分析

    前面分析的都是多数Makefile要读入的文件,这次我们以drivers/mtd/nand/Makefile为例,分析一个具体的子Makefile是如何工作的. 子Makefile的结构是固定的: i ...

  7. RabbitMQ 适用于云计算集群的远程调用(RPC)

    在云计算环境中,很多时候需要用它其他机器的计算资源,我们有可能会在接收到Message进行处理时,会把一部分计算任务分配到其他节点来完成.那么,RabbitMQ如何使用RPC呢?在本篇文章中,我们将会 ...

  8. Python之旅Day5 列表生成式 生成器 迭代器 装饰器

    装饰器 器即函数,装饰即修饰,意指为其他函数添加新功能 装饰器定义:本质就是函数,功能是为其他函数添加新功能 装饰器涉及的知识点= 高阶函数+函数嵌套+闭包 在遵循下面两个原则的前提下为被装饰者新功能 ...

  9. [转] KVM I/O slowness on RHEL 6

    KVM I/O slowness on RHEL 6 http://www.ilsistemista.net/index.php/virtualization/11-kvm-io-slowness-o ...

  10. 第39节:Java当中的IO

    Java当中的IO IO的分类 第一种分:输入流和输出流 第二种分:字节流和字符流 第三种分:节点流和处理流 节点流处理数据,处理流是节点流基础上加工的. IO中的重点: InputStream Ou ...