zoukankan      html  css  js  c++  java
  • Java this与super的仇与恨

    刚开始学习面向对象的时候,看到this和super觉得this就是指当前对象,super指最近的父级对象。觉得用处不大。

    后来,随着学习的深入,看别人的代码越来越多,发现this和super的使用率贼高~,就决定深入的了解一下这俩兄弟。

    既然设计到继承和对象,我们就可以从JVM的堆栈的角度去分析。

    首先,当我们创建一个子类的时候,在堆中的子类对象一定包含着其继承的父类对象。如果子类和父类都包含名字为value的成员变量。我们可以用this和super来进行操作。

    老规矩,show you my code。代码中参悟。

    父类:

    public class Father {
        int value;
    
        public void val() {
            value = 10;
            System.out.println("Father'value is" + value);
        }
    }

    子类:

    public class Child extends Father {
        int value;
    
        public void dirValue() {
            value = 20;
            System.out.println("Child'value is " + value);
            // 这时候应该为0
            System.out.println("子类中没有调用super的Father" + super.value);
            super.val();
            // 这个时候应该为10
            System.out.println("子类中调用super之后的Father" + super.value);
            System.out.println("Child'value is" + value);
        }
    }

    客户端:

    public class Client {
        public static void main(String[] args) {
            Child child = new Child();
            child.dirValue();
        }
    }

    输出结果:

    分析:

    当客户端创建子类的时,堆栈中的存储结构是这样的~

    执行new child实例的时候:

        栈                 堆

       child  ——》 Child对象(包含Father对象)

                           Child本身包含一个value的成员变量

             Child中的Father对象也含有一个value的成员变量

    当程序执行到child.dirValue()的时候:

    先给value成员变量赋值,这个时候是给自己对象中的value赋值。

    super.value,这个是指向这个child中Father对象的value,因为没有给其赋值,编译器会自动给其初始化为0。

    调用Father的中的方法,方法打印还有给Father对象value赋值。

    最后为了检验对父类的操作没有影响到子类的value值。

    总结:

    this:

    this是指向当前的对象,其本质就是一个指针了。

    this可以用于当成员变量的名称和参数相冲突的时候用this.成员变量来指定。

    this可以用于构造函数之中,用来引用其他的构造函数。(必须是第一行)

    super:

    super是指向当前对象里的父类的对象。(super在Java中是个关键词)

    子类构造方法用了super指的是调用父类中的构造方法。

       

  • 相关阅读:
    Eclipse配置SVN的几种方法及使用详情
    重新定位svn地址的方法(windows和linux),svn switch(sw)的帮助信息
    SVN版本库修改URL路径或者IP地址
    DEA中MAVEN项目有多个子目录,如何加载构建
    DBA的40条军规
    搜索 比MySQL快10倍?这可能是目前AWS Aurora最详解读!
    HttpClient 4.5.3 get和post请求
    基于HttpClient4.5.2实现的HttpClient工具类
    httpClient使用总结
    为何只能在其关联的线程内启动timer?(Qt会检查一致性,否则就不执行)
  • 原文地址:https://www.cnblogs.com/tujietg/p/10254433.html
Copyright © 2011-2022 走看看