• 谈谈this和super关键字


    this关键字

    this的本质就是:创建好的对象的地址 -> 代表当前对象

    构造方法是创建java对象的重要途经,通过new关键字调用构造器时,构造器返回该类对象,但是该对象并不完全由构造器创建

    创建对象分为四步:

    • 分配对象空间,将对象成员变量初始化为0或null;
    • 执行属性值显式初始化;
    • 执行构造方法;
    • 返回对象地址给相关变量

    因为在调用构造方法前,对象已被创建,所以this可以在构造方法中充当当前对象

    1. public construct(int id, String name){
    2. this.id = id;
    3. this.name = name;
    4. }

    举个例子,分析一下创建对象的过程

    1. class Person {
    2. int age;
    3. String sex;
    4. public Person(int age, String sex) {
    5. this.age = age;
    6. this.sex = sex;
    7. }
    8. }
    9. public class Demo {
    10. public static void main(String[] args) {
    11. Person person = new Person(22 ,"boy");
    12. }
    13. }

    在这里插入图片描述
    this可以调用重载的构造方法

    1. class Person {
    2. int age;
    3. String sex;
    4. String name;
    5. public Person(int age, String sex) {
    6. this.age = age;
    7. this.sex = sex;
    8. }
    9. public Person(int age,String sex,String name){
    10. this(age,sex); //this()访问其他构造方法
    11. this.name = name;
    12. }
    13. }

    总结:

    • this可以用于构造方法中代表当前对象;
    • this也可以调用重载的构造方法,但是必须位于构造方法第一句
    • this不能用与static方法中

    super关键字

    • 访问父类的构造函数:可以使用 super() 函数访问父类的构造函数,从而委托父类完成一些初始化的工作。应该注意到,子类一定会调用父类的构造函数来完成初始化工作,默认调用父类的无参构造函数,如果子类需要调用父类其它构造函数,那么就可以使用 super() 函数,但是必须位于构造方法第一句。(所以在构造器中this和super不能共存,只能用一个)

    • 访问父类的成员:如果子类重写了父类的某个方法,可以通过使用 super 关键字来引用父类的方法实现。

    1. public class SuperDemo {
    2. protected int x;
    3. protected int y;
    4. public SuperDemo(int x, int y) {
    5. this.x = x;
    6. this.y = y;
    7. }
    8. public void func() {
    9. System.out.println("调用父类方法");
    10. }
    11. }
    12. public class SuperExtend extends SuperDemo {
    13. private int z;
    14. public SuperExtend(int x, int y, int z) {
    15. super(x, y); //super()访问父类构造方法
    16. this.z = z;
    17. }
    18. @Override
    19. public void func() {
    20. super.func(); //super引用父类方法实现
    21. System.out.println("调用子类方法");
    22. }
    23. }
    1. 运行结果:
    2. 调用父类方法
    3. 调用子类方法

    两者区别

    thissuper
    访问属性从本类属性开始访问,本类有并且可以访问则访问;没有从父类中查找,父类有并且可以访问则访问;如果父类没有则继续向上找直到Object类直接从父类中开始查找,直到Object类
    调用方法调用本类方法,本类如果没有此方法或则不能访问,则从父类中调用,以此类推,直到Object类直接调用父类方法,直到Object类

    总而言之,this是先从本类开始查找属性/方法,super是直接从其父类开始查找属性/方法

     

  • 相关阅读:
    计算机网络复习
    4---Linux:gcc,g++编译/制作并调用静态库,动态库/makefile
    C++ 信奥编程 1132:石头剪子布
    十九种卷积
    GAN反演+老照片修复
    LeetCode100122. Separate Black and White Balls
    297. 二叉树的序列化与反序列化
    认识一些分布函数-Frechet分布及其应用
    opencv 直方图比较
    做了几年“斜杠青年”,我在ZStack立志做国产云计算的研发
  • 原文地址:https://blog.csdn.net/Candyz7/article/details/127861878