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. docker_NG部署前端总结

    Dockerfile 写法 FROM nginx MAINTAINER gradyjiang "jiangzhongjin@hotmail.com" ENV LANG C.UTF- ...

  2. React Native 入门 调试项目

    不管时用哪种语言,哪种框架,调试永远都是一个避不开的话题 为我们提供了远程调试的功能,而这个功能需要Chrome浏览器的配合. 1. 首先浏览器一定要安装好React Developer Tool 插 ...

  3. Oracle PLM,协同研发的产品生命周期管理平台

    官网:Oracle PLM - 方正璞华 适用企业:电子高科技.机械制造.医疗器械.化工行业等大型企业和中小型企业 咨询热线:4006-160-730 申请试用.预约演示.产品询价 邮箱:jiangc ...

  4. Bugly iOS自动导入符号表

      前言       最近在处理Bugly问题的时候顺便解决了下符号表上传的问题,使用最新的上传工具包,也是顺便整理了下可以使用的脚本添加到了项目中,把这个过程中遇到的问题总结出来,脚本也会给出来,实 ...

  5. jenkins修改默认的workspace工作目录

    1.首先,找到Jenkins安装根目录,寻找config.xml文件,在config.xml文件内,查找 workspaceDir 关键字,将你的自定义 工作空间根目录 地址替换默认的地址 # cd ...

  6. Portainer实用教程

    Portainer使用 Nginx 容器实现端口转发 在 WordPress 部署完成后,需要在浏览器内输入 IP:端口或域名:端口 的形式访问网站,但我们一般访问应用的时候都是希望不加端口就能访问域 ...

  7. Vue中生成UUID

    <template> <div :id="elId" class="container"> <a>{{elId}}</ ...

  8. POJ1734 Sightseeing trip (Floyd求最小环)

    学习了一下用Floyd求最小环,思路还是比较清晰的. 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring ...

  9. 几个Caller-特性的妙用

    System.Runtime.CompilerServices命名空间下有4个以"Caller"为前缀命名的Attribute,我们可以将它标注到方法参数上自动获取当前调用上下文的 ...

  10. Docker | 部署nginx服务

    容器时相互隔离的,docker启动的nginx是容器内的服务,不影响我原先服务器上的nginx服务,小伙伴们可大胆尝试 本篇实在linux环境下操作的,主要目的是夺人眼目,对使用Docker部署服务尝 ...