this与super的含义

在Java中,this有两层含义:

  1. 指示隐式参数的引用(就是当前对象的引用)
  2. 调用该类的其他构造器

而super也有两层含义:

  1. 调用超类的方法
  2. 调用超类的构造器

前言

在写这篇文章之前,我也查阅了其他博主关于super与this的区别的文章,他们都讲的很对,但是没有说到我想知道的重点。例如cheneypku的这篇文章 Java中this与super的区别 所述:

它们的区别:

1、super()主要是对父类构造函数的调用,this()是对重载构造函数的调用

2、super()主要是在继承了父类的子类的构造函数中使用,是在不同类中的使用;this()主要是在同一类的不同构造函数中的使用

但是,它们还有一点不同,那就是:

super不是一个对象的引用,因此不能够将super赋给另一个对象变量,他只是一个指示编译器调用超类(或父类)方法的特殊关键字。

例证

this

可以把this赋值给对象类型的对象变量,进而调用类中的数据字段。

public class Students{
private String name;
private String otherName;
private int age; Students S = this; //编译通过 public Students(String name, String otherName, int age){
S(otherName); //出现错误!
//or
this(otherName);//编译通过!所以在调用其它构造器时,还是只能使用this()!
S.age = age; //可以正常引用Students类中的数据字段
}
public Students(String OtherName){
S.otherName = OtherName;
} }

这说明,this实际上是当前对象的一个引用,可以被赋值给相应的对象变量。但是,当需要调用类中的其他构造器时,还是只能够使用this()语句!

super

class Person{
private String name;
public Person(String name){ //超类的构造函数
this.name = name;
}
public String getName(){ //定义一个方法
return name;
}
}
public class Students extends Person{
private String name;
private int age; Person P = super;//已经出现了编译错误!!
public Students(String name, int age){
P(name);//编译错误!
P.getName();//错误!!也不能调用超类的方法!
this.age = age;
}
}

所以,super不能够赋给一个对应的对象变量,它不是一个对象的引用!

总结

它们的相同点是:调用构造器的语句只能够作为另一个构造器的第一条语句出现,这也是它们不能够出现在同一个构造器内的原因。

而this的本质是一个对象的引用,super只是一个指示编译器调用超类方法的特殊关键字,但在调用本类中的其他构造器时,还是只能够使用this()语句。

虽然这个点很小,但是希望能够帮助各位更加深刻的理解this和super的区别!不正之处,还希望读者不吝赐教!

super与this的区别,更进一步的区别!——Java学习的更多相关文章

  1. 浅析String、StringBuffer、StringBuilder的区别以及性能区别

    前奏: 比较三者之间的区别在与区别他们做相同的事情的时候的区别,那就是在我们常见的拼接字符串的时候,StringBuffer.StringBuilder调用的是appende()方法,而String很 ...

  2. Java学习笔记--Collection和Collections的区别

    转自 http://pengcqu.iteye.com/blog/492196 比较Collection 和Collections的区别.   1.java.util.Collection 是一个集合 ...

  3. Java学习|Exception和Error有什么区别?

    典型回答:      Exception和Error都继承了Throwable类,java中只有Throwable类型的实例才能被Throw(抛出)或者catch(捕获).      Exceptio ...

  4. Java中JDK、JRE和JVM三者之间有什么区别和联系?Java基础!

    任何语言或软件都需要一个运行环境.正如人想生活在空气中,鱼想生活在水中一样,喜荫植物不能暴露在阳光下,任何物体个体的存在都离不开其所需的环境,编程语言也是一样的. 接下来就详细描述一下Java中JDK ...

  5. Java 学习(11): 面向对象编程—继承(super,this)

    Java 继承 what: 继承就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例域和方法,或子类从父类继承方法,使得子类具有父类相同的行为.子类从它的父类中继承可访问的数据域和方法,也 ...

  6. Java学习笔记(2)--- 对象和类入门,java包,this 和 super区别

    1.对象和类(Object and class): 一个 Java 程序可以认为是一系列对象的集合,而这些对象通过调用彼此的方法来协同工作. 面对对象编程是java非常重要的一部分,作者本身之前学过c ...

  7. Java中super的用法并与this的区别(转载)

    一.子类中如果需要调用父类中的构造函数,则需要使用super(),且必须在构造函数中的第一行 public class Demo1 { public static void main(String[] ...

  8. OpenJDK源码研究笔记(二)-Comparable和Comparator2个接口的作用和区别(一道经典的Java笔试面试题)

    Comparable和Comparator是JDK中定义的2个比较接口,很相似,但又有所不同. 这2个接口的作用和区别也是Java中的常见经典面试题. 下面我们就来详细介绍下这2个接口的定义.作用.区 ...

  9. Java学习2 - JDK和JRE和JVM的区别_JDK的下载安装_环境变量配置

    一 JDK和JRE和JVM的区别 Jdk: Java Development kit - Java 开发工具 JRE: Java Runtime Environment - java运行环境 JVM: ...

随机推荐

  1. GPO - Windows Server Update Services

    Windows Server Update Services Configuration Wizard: Approve procedure of these updates is very tiri ...

  2. Python Ethical Hacking - VULNERABILITY SCANNER(7)

    VULNERABILITY_SCANNER How to discover a vulnerability in a web application? 1. Go into every possibl ...

  3. 使用PowerShell自动编译部署前端

    前言 最近在开发一套管理系统,做了前后端分离. 后台使用的是Asp.Net Core 3.1 前端使用的是Vue+Ant Design 自己搞了一台云服务器,打算把系统部署到云服务器上.以供外网访问. ...

  4. Kubernetes的10个基本事实!你知道几个?k8s与Docker又有何不同?

    无论您是Kubernetes的新手还是只是想获得更多知识,这篇文章都会帮到您! Kubernetes是一个增长的趋势.近年来,K8s技术经历了从小型开源Google项目到Cloud Native Co ...

  5. Linux切换用户时报错/.bash_profile: Permission denied,命令行(终端提示符)出现-bash-4.2$

    Linux切换用户时报错/.bash_profile: Permission denied,命令行(终端提示符)出现-bash-4.2$ 利用su - 切换用户时,发现有一个用户切时出现如下情况 [r ...

  6. Thinkphp5-0-X远程代码执行漏洞分析(2019-1-11)

    周五下午爆洞能不能让人们好好休个周末! 分析过程 本次漏洞关键位置:/thinkphp/library/think/Request.php,lines:501由图可以看到在method函数中引入了可控 ...

  7. python map函数、filter函数、reduce函数

    1.map函数:map(func,可迭代对象): ①func可以是自定义的函数,也可以是功能简单的匿名函数(通过lambda定义) ②处理逻辑:表示将传入的可迭代对象依次循环,将每个元素按照传入的fu ...

  8. Bug--Mybatis报错:There is no getter for property named 'id' in 'class java.lang.Integer'

    Mybatis 添加@Param("")注释就可以了

  9. 富文本数据 解析HTML

    后台返回给前端的富文本数据如: { "status": 1, "info": "获取活动数据成功", "data": [ ...

  10. C/C++编程笔记:C语言入门知识点(三),请收藏C语言最全笔记!

    今天我们继续来学习C语言的入门知识点,第一课:C/C++编程笔记:C语言入门知识点(二),请收藏C语言最全笔记! 21. 输入 & 输出 当我们提到输入时,这意味着要向程序填充一些数据.输入可 ...