Java中super和this的用法详解

 更新时间:2020年08月21日 10:03:27   作者:sakura_inm  
这篇文章主要介绍了Java中super和this的用法详解,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

super 用法
super关键字用来访问父类内容,具体用法可分为三种:
1.子类的成员方法访问父类的成员变量

public class Animal {
  public int age = 10;
}

class Dog extends Animal {
  public int age = 5;

  public void showAge() {
    System.out.println(super.age);
  }
}

2.子类的成员方法访问父类的成员方法

public class Animal {
  public void fn(){
    System.out.println("父类Animal的方法");
  }
}

class Dog extends Animal {
  @Override
  public void fn() {
    super.fn();
    System.out.println("子类Dog的方法");
  }
}

3.子类的构造方法访问父类的构造方法

public class Animal {
  public Animal() {
    System.out.println("父类Animal的构造方法");
  }
}

class Dog extends Animal {
  public Dog() {
    super();
    System.out.println("子类Dog的构造方法");
  }
}

this 用法
this关键字用来访问本类内容,具体用法可分为三种:
1.本类的成员方法访问本类的成员变量

public class Dog extends Animal {
  public int age = 1;

  public void showAge() {
    int age = 3;
    System.out.println(age);
    System.out.println(this.age);
  }
}

2.本类的成员方法访问本类的另一成员方法

public class Dog extends Animal {
  public int age = 1;

  public void showAge() {
    int age = 3;
    System.out.println(age);
    System.out.println(this.age);
  }

  public void fn() {
    this.showAge();
  }
}

3.本类的构造方法访问本类的另一个构造方法,此时this(…)调用必须放在这个构造方法中的第一句,且只能使用一次

public class Dog extends Animal {
  public Dog() {
    this(2);
    System.out.println("无参构造");
  }

  public Dog(int age) {
    System.out.println(age);
    System.out.println("有参构造");
  }
}

super和this内存图解

在这里插入图片描述

  • 方法区中存放包含主方法的Demo、父类和子类的class对象,编译后在子类的class对象中会有一个super_class标记指向父类,表明二者的继承关系
  • 主方法进栈,执行语句new一个子类对象,栈中存放该对象的地址值,指向堆中开辟的一块用于存放该子类对象的内存,注意堆中子类对象内容还包括完整的父类结构
  • 主方法中执行子类的show方法,show方法进栈,栈中存放show方法中的局部变量num,输出局部变量num的值,接着输出this.num,this指向子类对象,this.num得到堆中子类变量num的值,最后输出super.num得到的是堆中存储的父类变量的值
  • 主方法执行子类的method方法,子类method方法进栈,子类method方法中使用super.method()调用父类的method方法,父类的method方法进栈

总结

到此这篇关于Java中super和this的用法的文章就介绍到这了,更多相关Java中super和this的用法内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java HashMap实现原理分析(一)

    Java HashMap实现原理分析(一)

    这篇文章主要介绍了Java HashMap实现原理的分析,帮助大家更好的理解和使用Java,感兴趣的朋友可以了解下
    2020-08-08
  • java如何将int数组转化为Integer数组

    java如何将int数组转化为Integer数组

    这篇文章主要介绍了java如何将int数组转化为Integer数组,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-11-11
  • mybatis 传入null值的解决方案

    mybatis 传入null值的解决方案

    这篇文章主要介绍了mybatis 传入null值的解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-03-03
  • Java时间复杂度、空间复杂度的深入详解

    Java时间复杂度、空间复杂度的深入详解

    对于一个算法,其时间复杂度和空间复杂度往往是相互影响的,当追求一个较好的时间复杂度时,可能会使空间复杂度的性能变差,即可能导致占用较多的存储空间,这篇文章主要给大家介绍了关于Java时间复杂度、空间复杂度的相关资料,需要的朋友可以参考下
    2021-11-11
  • 关于SpringBoot中事务失效的几种情况

    关于SpringBoot中事务失效的几种情况

    这篇文章主要介绍了关于SpringBoot中事务失效的几种情况,Spring AOP默认使用动态代理,会给被代理的类生成一个代理类,事务相关的操作都通过代理来完成,使用内部方法调用时,使用的是实例调用,没有通过代理类调用方法,因此事务不会检测到失败,需要的朋友可以参考下
    2023-08-08
  • 深入理解java泛型Generic

    深入理解java泛型Generic

    这篇文章主要介绍了深入理解java泛型Generic,文中有非常详细的代码示例,对正在学习java的小伙伴们有非常好的帮助,需要的朋友可以参考下
    2021-05-05
  • 详解如何使用SpringBoot的缓存@Cacheable

    详解如何使用SpringBoot的缓存@Cacheable

    这篇文章主要为大家介绍了如何使用SpringBoot的缓存@Cacheable详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-06-06
  • 你肯定能看懂的Java IO相关知识总结

    你肯定能看懂的Java IO相关知识总结

    群里有大佬说想让我写一篇NIO,一直也没写,但是和同事聊天也说对Java的IO不是很清晰,因此今天就写下Java的io,先打个基础,下次写NIO,需要的朋友可以参考下
    2021-05-05
  • Struts2 漏洞分析及如何提前预防

    Struts2 漏洞分析及如何提前预防

    2016年4月26日,Struts2发布一份安全公告,CVE编号 CVE-2016-3081。这是自2012年Struts2命令执行漏洞大规模爆发之后,该服务时隔四年再次爆发大规模漏洞。该漏洞也是今年目前爆出的最严重安全漏洞。本文分析了漏洞的原理危害影响防护等内容。
    2016-05-05
  • Java使用PrepareStatement实现数据的插入与查询操作

    Java使用PrepareStatement实现数据的插入与查询操作

    这篇文章主要为大家详细介绍了Java如何使用PrepareStatement实现数据的插入与查询操作,文中的示例代码讲解详细,感兴趣的可以了解一下
    2022-09-09

最新评论