Java this 关键字的使用方法详解

构造方法中的this关键字

构造方法是一个类的对象在通过new关键字创建时自动调用的,在程序中不能向调用其他方法一样通过方法名(也就是类名)来调用。但如果一个类有多个构造方法,可以在一个构造方法中通过this(paras…)来调用其他的构造方法。

使用this来调用其他构造方法有如下几个约束。

1) 只能在构造方法中通过this来调用其他构造方法,普通方法中不能使用。

2) 不能通过this递归调用构造方法,即不能在一个构造方法中通过this直接或间接调用该构造方法本身。

例如:

class test {

test() {

this(1);

}

test(int a){

this();

}

test(int a, int b) {

this(1, 2);

}

}

test()方法中调用了test(int)构造方法,而test(int)构造方法又调用了test()构造方法,构成递归调用。test(int, int)中调用了自身,也构成了递归调用。都是不允许的。

3) 通过this调用其他构造方法必须放在构造方法的第一行中执行。由于super调用父类的构造函数也必须放在构造方法的第一行中执行,因此,通过this和super调用构造方法不能同时出现一个构造方法中。也不能在一个构造方法中多次调用不同的构造方法。

在构造方法中也可以使用this关键字来访问本类中的成员变量和成员函数。其用法和非构造方法中的this关键字相同。

非构造方法中的this关键字

在Java中可以通过通过this关键字来调用类中的成员变量和方法。其用法是。

1) this.xxx; 访问类中的成员变量xxx

2) this.yyy(paras…); 访问类中的成员方法yyy

3) this; 当前类对象的引用

this关键字访问类的成员变量和成员函数时不受访问权限的控制,可以访问本类中所有的成员变量和方法,包括private的成员变量和方法。也可以通过this访问本类的static成员,不过由于static成员可以通过类名直接访问,如果通过this来访问会有“The static field ××× should be accessed in a static way”的警告信息。不能在类的static成员或static块中使用this。

继承关系下的this关键字

在继承关系下,父类中的this关键字并不总是表示父类中的变量和方法。this关键字的四种用法如前文所述,列举如下。

1) this(paras…); 访问其他的构造方法

2) this.xxx; 访问类中的成员变量xxx

3) this.yyy(paras…); 访问类中的成员方法yyy

4) this; 当前类对象的引用

对第一种,无论子类是否有相同参数的构造方法,this(paras…);访问的始终是父类中的构造方法。

对第二种,无论子类是否有覆盖了该成员变量,this.xxx;访问的始终是父类中的成员变量。

对第三种,如果子类重写了该成员方法,则this.yyy(paras…);访问的是子类的成员方法,如果子类没有重写该成员方法,则this.yyy(paras…);访问的是父类的成员方法。

对第四种,this始终代表的是子类的对象。

例如:

public class ClassTest {

public static void main(String[] args) {

Child child = new Child();

child.show();

}

}

class Parent {

public String str;

Parent(){

this(1);

}

Parent(int a) {

this.str = "Parent";

this.show();

}

public void show() {

System.out.println(this.str);

}

}

class Child extends Parent {

public String str;

Child() {

}

Child(int a) {

str = "Child";

}

public void show() {

System.out.println(str);

super.show();

}

}

main()函数中有两条语句,new Child()和child.show()。

第一条语句new Child()时要执行Child类的构造方法,但是Child类是Parent类的子类,因此会先执行Parent类的构造方法。Child类的无参构造函数中没有使用super和this来调用父类或本类中的其他的构造方法,因此会调用父类的无参构造函数。在父类的无参构造函数Parent()中调用了执行了this(1),此调用表示执行父类中有一个整数参数的构造方法,虽然子类中也有一个有一个整数参数的构造方法,但是并不会被执行。父类中有一个整数参数的构造方法执行this.str=”Parent”,这里的this.str代表的是父类中的成员变量str,虽然子类中也有一个成员变量str,但是并不会被赋值。将父类中的成员变量str赋值为”Parent”后,接着执行了this.show(),虽然父类中有一个show()方法,但由于子类重写了show()方法,所以this.show()执行的子类的show()方法。子类的show()方法首先执行了打印str的操作,此时打印的显然是子类中的str,子类的str没有被赋值,因为打印null。接着子类的show()方法执行了super.show(),即调用了父类的show()方法,在父类的show()方法中执行了打印this.str的操作,this.str同样代表父类中的成员变量str,因此打印”Parent”。

第二条语句child.show()先是执行子类的show()方法,子类的show()先是打印了子类的str值(null),然后执行了父类的show()打印了父类的str值(”Parent”)。

两条语句的打印结果为null, Parent, null, Parent。

如果将第一条语句改为new Child(1),则执行的是子类的有一个整数参数的构造方法,仍然是先执行父类的无参构造方法,初始化父类的str为”Parent”,然后执行子类的show(),子类的show()打印子类的str值(null),然后执行父类的show(),父类show()打印父类的str值(”Parent”),然后执行子类的构造方法将子类的str初始化为”Child”。 第二条语句child.show()先是执行子类的show()方法,子类的show()先是打印了子类的str值(”Child”),然后执行了父类的show()打印了父类的str值(”Parent”)。

两条语句的打印结果为null, Parent, Child, Parent。

super和this的异同

super在一个类中用来引用其父类的成员,它是在子类中访问父类成员的一个桥梁,并不是任何一个对象的引用,而this则表示当前类对象的引用。在代码中Object o = super;是错误的,Object o = this;则是允许的。

super关键字的作用在于当子类中覆盖了父类的某个成员变量,或者重写了父类的某个成员方法时还能够访问到父类的成员变量和成员方法。如果子类中没有重写父类的成员变量和成员方法,则子类会继承父类的所有非private的成员变量和成员方法。这时在子类中无论通过this来访问成员和通过super来访问成员,结果都是一样的。

super.getClass()和this.getClass()

getClass()是Object类定义的一个final方法,所有Java类的getClass()都继承自Object类。如前文所述,如果子类没有重写父类的某个成员方法,那么通过super来访问还是还是通过this来访问结果都是一样的。因此,super.getClass()和this.getClass()结果是一样的。Object类的getClass()方法返回的是该对象的运行时类,一个对象的运行时类是该对象通过new创建时指定的类。因此,super.getClass()和this.getClass()返回的都是new对象时指定的类。

例如:

public class ClassConstructorTest {

public static void main(String[] args) {

Child child = new Child();

child.show();

}

}

class Parent {

private Parent mSelf;

Parent(){

mSelf = this;

}

public void show() {

System.out.println(this.getClass().getName());

System.out.println(super.getClass().getName());

System.out.println(mSelf.getClass().getName());

}

}

class Child extends Parent {

public void show() {

System.out.println(this.getClass().getName());

System.out.println(super.getClass().getName());

super.show();

}

}

打印的类名都是Child。

如有疑问请留言或者到本站社区交流讨论,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

java this关键字的使用_Java this 关键字的使用方法详解相关推荐

  1. java中迭代器要导包吗_java 中迭代器的使用方法详解

    java 中迭代器的使用方法详解 前言: 迭代器模式将一个集合给封装起来,主要是为用户提供了一种遍历其内部元素的方式.迭代器模式有两个优点:①提供给用户一个遍历的方式,而没有暴露其内部实现细节:②把元 ...

  2. 安卓java安装apk代码_Android 通过代码安装 APK的方法详解

    在 APK 开发中,通过 Java 代码来打开系统的安装程序以安装 APK 并不是什么难事,一般的 Android 系统都有开放这一功能. 但随着 Android系统版本的迭代,其对于权限的把控越来越 ...

  3. java中 enum什么意思_Java中枚举Enum的使用详解

    在某些情况下,一个类的对象时有限且固定的,如季节类,它只有春夏秋冬4个对象这种实例有限且固定的类,在 Java 中被称为枚举类: 在 Java 中使用 enum 关键字来定义枚举类,其地位与 clas ...

  4. java原生类型没有封装_Java基本数据类型与封装类型详解(int和Integer区别)

    Java基本数据类型与封装类型详解(int和Integer区别) 发布于 2020-4-19| 复制链接 摘记: int是java提供的8种原始数据类型之一.Java为每个原始类型提供了封装类,Int ...

  5. java 封装表单数据类型_Java基本数据类型与封装类型详解(int和Integer区别)

    int是java提供的8种原始数据类型之一. Java为每个原始类型提供了封装类,Integer是java为int提供的封装类(即Integer是一个java对象,而int只是一个基本数据类型).in ...

  6. java 获取oracle表结构_Java导出oracle表结构实例详解

    Java导出oracle表结构实例详解 发布于 2020-7-20| 复制链接 摘记:  Java导出oracle表结构实例详解最近用到的,因为plsql是收费的,不让用,找了很多方法终于发现了这个. ...

  7. java case 多个值_Java switch多值匹配操作详解

    这篇文章主要介绍了Java switch多值匹配操作详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 我们都知道 switch 用来走流程分支,大 ...

  8. java uml类图教程_Java利器之UML类图详解

    原标题:Java利器之UML类图详解 (点击上方公众号,可快速关注) 来源:伯乐在线专栏作者- Code4Android 如需转载,发送「转载」二字查看说明 前言 UML(Unified Modeli ...

  9. [Java入门笔记] 面向对象编程基础(二):方法详解

    2019独角兽企业重金招聘Python工程师标准>>> 什么是方法? 简介 在上一篇的blog中,我们知道了方法是类中的一个组成部分,是类或对象的行为特征的抽象. 无论是从语法和功能 ...

  10. java 发送客服消息,Java调用微信客服消息实现发货通知的方法详解

    本文实例讲述了java调用微信客服消息实现发货通知的方法.分享给大家供大家参考,具体如下: 个人说明:这是一个样例,微信客户消息有很多种,我现在用的是公众号发送消息.样子如下图. 说明:下面开始代码部 ...

最新文章

  1. MESI缓存一致性协议
  2. JAVA线程池管理及分布式HADOOP调度框架搭建
  3. Sqoop 1.99.3 hadoop-1.2.1 安装配置
  4. ActionContextCleanUp作用
  5. 【HDU - 1559】最大子矩阵 (二维前缀和裸题)
  6. Git小技巧 - 指令别名及使用Beyond Compare作为差异比较工具
  7. memory java heap_java.lang.OutOfMemoryError: Java heap space解决方法
  8. 为什么跨境电商独立站将成为几年的焦点?
  9. 第 16 章 模板方法模式
  10. bzoj 1046: [HAOI2007]上升序列【dp+二分】
  11. C51简介及Keil的使用
  12. 清除逻辑库内的所有数据集
  13. Android 如何通过拨号盘暗码启动你的应用
  14. (转)ICO泡沫:8万本金赚套房子和宝马 几分钟十几万没了
  15. 小程序码 踩坑记录(buffer转成图片显示问题)
  16. 90个外国英文网站强力推荐!!!
  17. 优维科技低代码开发平台在券商系统的落地实践
  18. qt使用assimp加载模型_iOS使用assimpKit加载FBX模型步骤详解
  19. 世界上最强大的两个字母的单词
  20. 短视频矩阵系统源码。抖音矩阵系统源码。抖音SEO源码。

热门文章

  1. jdbc连接orcal数据库
  2. Python元祖,列表,字典,集合的比较
  3. linux之openssh配置
  4. spring_boot 与MyBatis 整合
  5. bzoj1770: [Usaco2009 Nov]lights 燈(折半搜索)
  6. 冒泡排序、递归、二分查找
  7. 红皮书:变量、作用域和内存问题(四)
  8. swfobject.js 2.2简单使用方法
  9. 《Cracking the Coding Interview》——第10章:可扩展性和存储空间限制——题目1
  10. 一些常用算法 练手的的代码