this、super详解

当我们在外部程序调用一个类的方法,如果这个类的方法与其父类的方法重载,我们需要用thissuper进行区分

this在Java中是一个复杂的关键字,this的使用形式体现了其灵活性,可以实现三种结构形式的描述:

  1. 当前类中的属性:this.属性; super.属性

  2. 当前类中的方法(构造方法、普通方法):

  • 普通方法:this.方法名(); super.方法名();

  • 构造方法:this(); super(); —————————————因为构造方法的方法名与类名一致所以直接省去;

  1. 描述当前对象;

第一种this.属性; super.属性;

在普通方法中:当形参与成员名字相同时,用this.属性; super.属性;加以区分

我们先来看第一种结构形式的案例:

public class Person{
String name="工地佬";
}
public class Students{
private name="工地牛马";
public void test(String name){
System.out.println(name);//此时这个name表示的是当前参数的name;
System.out.println(this.name);//this.name表示当前类的属性,this代表的是Students实例化后的对象
System.out.printlb(super.name);//super.name表示来自的父类的属性;
}
}
public class Application{
public static void main(String[] args){
Students stu=new Students;//Students类实例化时,父类的构造器也会被调用
stu.test("超级牛马");
}
}

第二种thissuper结构形式:

this.方法名();——调用本类的方法

super.方法名();——调用父类的方法

//输出结果
超级牛马
工地牛马
工地佬
public class Person{
String name="工地佬";
public void print(){
System.out.println("父类的方法输出了")
}
}
public class Students extends Person{
private name="工地牛马";
public void print(){
System.out.println("子类的方法输出了")
}
public void test1(){
print();//调用本类的print方法
this.ptint();//调用本类的print方法
super.print();//调用从父类继承过来的的print方法 //有人可能疑问,为什么可以直接调用上面的print方法;
//首先两个都是非静态方法,其次Students是Person的子类,Person的方法会被继承,最后非静态的方法可以相互调用!
}
}
public class Application{
public static void main(String[] args){
Students stu=new Students();
stu.print();
}
}
//输出结果
子类的方法输出了
子类的方法输出了
父类的方法输出了

在构造方法中this();是调用自身的构造方法

public class Students{
String name;
int age;
public Students(){
this.name="工地佬";
}
public Students(int age){
this();//此时则是在调用自身的构造器
this.age=age;
}
}

构造方法中的super(); 调用父类的构造器

public class Person{
public Person{ }
}
//Students是Person的子类
public class Students extends Person{
//当父类是无参构造器时,子类可定义有参或无参构造方法
public Students{
//此处隐藏一个父类构造器:super();
}
public Students(String name){
//此处隐藏一个父类构造器:super();
}
}
public class Person{
public Person(String name){ }
}
//Students是Person的子类
public class Students extends Person{
//当父类是有参构造器时,子类构造器中那个默认的父类构造器一定要显示的定义为有参构造;
//因为子类构造器中含有隐藏的、默认的父类无参构造器;
//如果我们不显示的定义父类有参构造器;当子类实例化时,默认的无参父类构造器无法运行,因为父类是有参构造器,构造器不一致,无法构造
//所以我们在定义一个有参构造器的时候,一定要将无参构造器显示的定义出来
public Students{
//此处隐藏一个无参父类构造器:super();如果不加以修改,无参和有参发生冲突,父类构造器无法调用
super(String name);//也就是说子类中调用的父类构造器要与父类中的构造器相符
}
public Students(String name){
//此处隐藏一个无参父类构造器:super();如果不加以修改,无参和有参发生冲突,父类构造器无法调用
super(String name);
}
}

总结:

  • super(参数);是在调用父类的构造器;this(参数);是在调用本类的构造器

  • super的结构形式只能出现在子类或者构造器中;

  • super调用父类方法时在构造器中的必须在代码的第一行;

  • super和this调用构造器时不能同时出现;因为this();会调用本类其他构造器,必然含有super();

  • this代表的是调用者本身这个对象,是指向对象的一个指针;

  • super可以理解为是指向自己父类对象的一个指针;

Day20.1:关于this、super的解析的更多相关文章

  1. Objective-C语言--self和super关键字解析

    看代码: @implementation Son : Father - (id)init{ self = [super init]; if (self){ } return self; } self是 ...

  2. java中? extends T 和? super T解析

    转:https://blog.csdn.net/qq_25337221/article/details/81669630 PECS原则 最后看一下什么是PECS(Producer Extends Co ...

  3. Scala 特质全面解析

    要点如下: Scala中类只能继承一个超类, 可以扩展任意数量的特质 特质可以要求实现它们的类具备特定的字段, 方法和超类 与Java接口不同, Scala特质可以提供方法和字段的实现 当将多个特质叠 ...

  4. Android 数据存储(XML解析)

      在androd手机中处理xml数据时很常见的事情,通常在不同平台传输数据的时候,我们就可能使用xml,xml是与平台无关的特性,被广泛运用于数据通信中,那么在android中如何解析xml文件数据 ...

  5. Android学习笔记_7_使用 sax 或者 dom 或者 pull 解析XML文件

    一.Pull解析介绍: Android上使用SAX和DOM方式解析XML的方法,并且对两种做了简单的比较,通过比较我们知道对在往往内存比较稀缺的移动设备上运行的Android系统来说,SAX是一种比较 ...

  6. ES6语法中的class、extends与super的原理

    class 首先, 在JavaScript中, class类是一种函数 class User {    constructor(name) { this.name = name; }    sayHi ...

  7. xml数据解析和生成

    java中xml的解析方式有许多,有java自带的DOM.SAX,android中的PULL,其它的还有DOM4J.JDOM等. 本文简要讲述DOM.SAX.PULL三种方式. 1.DOM方法 缺点: ...

  8. [Scala] 快学Scala A1L1

    基础 1.1 声明值和变量 在Scala中,鼓励使用val; 不需要给出值或变量的类型,这个信息可以从初始化表达式推断出来.在必要的时候,可以指定类型. 在Scala中,仅当同一行代码中存在多条语句时 ...

  9. 【第四篇】Volley修改之GsonRequest

    json解析工具类的引入,这里引用lite马天宇的解析json的工具类: public class GsonImpl extends Json { private Gson gson = new Gs ...

  10. 快学Scala之特质

    一个Scala类可以继承多个特质(trait), 特质可能会要求使用它们的类支持某个特定特性, 与Java接口不同, Scala特质可以给出这些特质的缺省实现. 要点如下: Scala中类只能继承一个 ...

随机推荐

  1. Java SE note1

    1.数据类型 基本类型 低------------------------------------------------->高 byte,short,char -> int -> ...

  2. 5.使用nexus3配置npm私有仓库

    当我们运行前端项目的时候,常常在解决依赖的时候会加上一个参数npm install --registry=https://registry.npm.taobao.org将源指定为淘宝的源,以期让速度加 ...

  3. PPR管及管件的类型、规格与选用

    1. PPR管的类型及参数识读 2. 常用的PPR管件及规格 3. 住宅给水管的PPR管及管件的需求量

  4. python csv写入多列

    import csv import os def main(): current_dir = os.path.abspath('.') file_name = os.path.join(current ...

  5. 基于python的端口扫描

    前言 端口扫描是指某些别有用心的人发送一组端口扫描消息,试图以此侵入某台计算机,并了解其提供的计算机网络服务类型(这些网络服务均与端口号相关).端口扫描是计算机解密高手喜欢的一种方式.攻击者可以通过它 ...

  6. 虚拟线程 - VirtualThread源码透视

    前提 JDK19于2022-09-20发布GA版本,该版本提供了虚拟线程的预览功能.下载JDK19之后翻看了一下有关虚拟线程的一些源码,跟早些时候的Loom项目构建版本基本并没有很大出入,也跟第三方J ...

  7. mac通过docker一键部署Nexus3

    目录 mac通过docker一键部署Nexus3 一.前言 二.系统配置 三.安装步骤 1.Dockerhub查看镜像地址 2.一键安装 2.1.克隆脚本 2.2.安装程序 2.2.1.程序安装详情 ...

  8. Mac Mojave 10.14.5安装python tesserocr

    <1>先安装两个依赖库: brew install tesseract brew install leptonica 网上有些教程说要安装imagemagick,这里我觉得应该是不需要的, ...

  9. 糟了,线上服务出现OOM了

    前言 前一段时间,公司同事的一个线上服务OOM的问题,我觉得挺有意思的,在这里跟大家一起分享一下. 我当时其实也参与了一部分问题的定位. 1 案发现场 他们有个mq消费者服务,在某一天下午,出现OOM ...

  10. kafka详解(二)--kafka为什么快

    前言 Kafka 有多快呢?我们可以使用 OpenMessaging Benchmark Framework 测试框架方便地对 RocketMQ.Pulsar.Kafka.RabbitMQ 等消息系统 ...