PoeticalJustice

导航

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!

posted on 2017-09-29 14:36  PoeticalJustice  阅读(157)  评论(0编辑  收藏  举报