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 阅读(163) 评论(0) 编辑 收藏 举报