zoukankan      html  css  js  c++  java
  • super关键字

    写在前面

    聊到super,一定会想到this,没错他们都是对象的引用,表示一个指向对象的地址。

    他们是2个隐式参数,不用你传,本身就有。 每一个构造方法都具备这2个隐式参数

    只不过指向的对象不同,super指向的父类对象的引用,this是对自身对象的引用。

    说到这,一定要提一下构造器,又叫构造方法,我们知道,无参构造方法,JVM虚拟机会帮我们创建,

    当然你可以重写,那么编译器就不帮你建了,反正,你建不建,他都在哪里,不增不减。

    那么我们有必要去了解一下super的底层实现原理。

    首先,Object类是一切类的根基类(老祖宗)所以Object类没有父类 所以也就没有super();

    建一个父类Animal和一个子类Bird

     1 public class Animal {
     2     String eye;
     3     
     4     public void run(){
     5         System.out.println("跑跑!");
     6     }
     7     public void eat(){
     8         System.out.println("吃吃!");
     9     }
    10     public void sleep(){
    11         System.out.println("睡觉觉!");
    12     }
    13     /*可以不写 编译器帮我们写
    14      * 构造方法  可写可不写,一般不写, 因为Animal是Object的子类    
    15      *  因为Object是根基类 所以 Object没有super();
    16     public Animal(){
    17         super();//super必须在第一行
    18         System.out.println("创建一个动物");
    19     }*/
    20 }

    子类Bird

     1 class Bird extends Animal{
     2     //不满意可以重写 overwrite
     3     public void run(){
     4         super.run();//调用的原来父类Animal的run();方法
     5         System.out.println("飞啊飞");
     6     }
     7     
     8     public void eggsheng(){
     9         System.out.println("我是卵生");
    10     }
    11     /**
    12      * 同上 
    13     public Bird(){
    14         super();
    15         System.out.println("建一个鸟对象");
    16     }
    17     */
    18     
    19 }

    main方法 我们创建一个鸟对象,看看实现。

    1 public class Test {
    2 
    3     public static void main(String[] args) {
    4         // TODO Auto-generated method stub
    5         Bird b = new Bird();
    6         b.run();
    7     }
    8 
    9 }

    控制台打印

    跑跑!
    飞啊飞

    是不是 我们既实现了父类Animal的run();   跑跑!

               又实现了 我们自己重写的run();    飞啊飞!

    所以,我们不写super();不代表不存在,在我们创建一个bird对象时,首先

    调用的是Bird类下面的构造方法(你不写,JVM帮你写,你写了,就用你的,如果你还想用父类的方法,那么super.方法名();放在一行就可以了)

    找到super();我们就跳转到 Bird类 的 父类Animal的构造方法

    找到 super();跳转到Anima类的 父类Object类的 构造方法

    他没有super();因为他是根基类,他没有父类,所以,this指向对象object自身 ,他负责实现对象的创建

    Object类的构造方法 创建了  Object对象(怎么创建?请看Constructor构造方法那一篇)

    (那么Object有的方法 当然他都有 比如 equals和toString方法 等)

    然后,Animal的每一个方法的隐式参数this创建自己的对象和super会指向父类对象地址

    同理 Bird的每一个方法的隐式参数this创建自己的对象和super会指向父类对象地址

    无图无真相,我们用图来分析内存就懂了。

    最后,你来验证一下,调用一下toString();方法

    Over!

  • 相关阅读:
    腾讯云微服务
    docker 总结
    TDSQl
    腾讯云网络介绍
    openstack 搭建
    kvm2
    kvm
    ERA-interim数据下载
    ERA-interim
    win10软件使用指南备忘录
  • 原文地址:https://www.cnblogs.com/PoeticalJustice/p/7610906.html
Copyright © 2011-2022 走看看