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 类名后加变量名是什么意思?

    回答这个问题我们需要先了解两个事情: A是一个类,我们如果对他进行实例化,需要这样写: A a = new A(); 详细解释一下这个语句,首先等号左边做的事情:在JVM栈内存(stack)中定义了一 ...

  2. flink-cdc同步mysql数据到hbase

    本文首发于我的个人博客网站 等待下一个秋-Flink 什么是CDC? CDC是(Change Data Capture 变更数据获取)的简称.核心思想是,监测并捕获数据库的变动(包括数据 或 数据表的 ...

  3. 凭借SpringBoot整合Neo4j,我理清了《雷神》中错综复杂的人物关系

    原创:微信公众号 码农参上,欢迎分享,转载请保留出处. 哈喽大家好啊,我是Hydra. 虽然距离中秋放假还要熬过漫长的两天,不过也有个好消息,今天是<雷神4>上线Disney+流媒体的日子 ...

  4. K8S Pod Pending 故障原因及解决方案

    文章转载自:https://mp.weixin.qq.com/s/SBpnxLfMq4Ubsvg5WH89lA

  5. 修复 Elasticsearch 集群的常见错误和问题

    文章转载自:https://mp.weixin.qq.com/s/8nWV5b8bJyTLqSv62JdcAw 第一篇:Elasticsearch 磁盘使用率超过警戒水位线 从磁盘常见错误说下去 当客 ...

  6. 胎压监测系统(DWS)

    胎压监测系统(DWS)通过监测和比较行驶时各车轮和轮胎的滚动半径和旋转特性,以确定是否一个或多个轮胎明显充气不足,而非直接测量各轮胎的压力. 系统监测到异常时指示灯将点亮,且仪表上出现信息. 必须校准 ...

  7. 使用Portainer管理其他主机的docker应用有两种方式

    官方文档地址:https://docs.portainer.io/v/ce-2.9/admin/environments/add/docker 第一种方式 是在其他主机的docker 启动中放开237 ...

  8. 示例:Service连接应用程序

    整体思路: 1.创建pod 2.创建关联上一步pod的service 3.使用不同的方式配置service从而能够在集群内部访问 4.使用ssl方式加密访问service 5.配置service为no ...

  9. PostgreSQL 模式(SCHEMA)

    PostgreSQL 模式(SCHEMA)可以看着是一个表的集合. 一个模式可以包含视图.索引.据类型.函数和操作符等. 相同的对象名称可以被用于不同的模式中而不会出现冲突,例如 schema1 和 ...

  10. 从应用访问Pod元数据-DownwardApi的应用

    对于某些需要调度之后才能知道的数据,比如 pod 的 ip,主机名,或者 pod 自身的名称等等,k8s 依旧很贴心的提供了 Downward API 的方式来获取此类数据,并且可以通过环境变量或者文 ...