041_面向对象_14_继承_super

匿名 (未验证) 提交于 2019-12-02 22:56:40

一、super()方法

  super是直接父类对象的引用。可以通过super来访问父类中被子类覆盖的方法或属性。
  除了Object类之外其他所有类的构造方法第一句总是super(…)
二、super()的应用场景(重点)

  a)在普通方法中(非构造器)中的任何位置可以通过super(...)调用直接父类的构造方法、调完之后会在内存中生成父类的对象。  

  b)在任何类的构造方法中,若是构造方法的第一行代码没有显式的调用super(...);那么Java默认都会调用super(); 所以你这里的super(); 加不加都无所谓。super()必须位于构造方法第一行

  c)我们知道构造方法可以重载,所以一个构造方法的方法名对应N个重载的构造方法,调用时通过super(参数列表)来确定调用的是那一个构造方法。

三、演示示例  

package edu.aeon.test; /**  * [说明]:动物类  * @author aeon  *  */ public class Animal /* extends Object */ {     String eye;      public void run() {         System.out.println("跑跑!");     }      public void eat() {         System.out.println("吃吃!");     }      public void sleep() {         System.out.println("zzzzz");     }      public Animal() {         super();         System.out.println("创建一个动物!");     }  }  class Mammal extends Animal {      public void taisheng() {         System.out.println("我是胎生");     }  }  class Bird extends Animal {     public void run() {         super.run();         System.out.println("我是一个小小小小鸟,飞呀飞不高");     }      public void eggSheng() {         System.out.println("卵生");     }      public Bird() {         super();         System.out.println("建一个鸟对象");     } }
package edu.aeon.test; /**  * [说明]:测试继承及super()  * @author Administrator  *  */ public class TestExtends {      public static void main(String[] args) {           Bird b = new Bird();             b.run();     }  }

运行结果截图:

为了便于理解、我们画了一个本示例在内存中的结构图:

  

  从这个图中可以看出,继承关系在内存中是包裹结构。

  比如:当bird对象调用toString时、首先看当前类中有没有toString这个方法,如果没有去它的直接父类,如果直接父类没有在去直接父类的直接父类,这样依次到Object类,如果Object类没有,则抛出异常:The method xxx() is undefined for the type xxx类、但是在集成开发环境中可以避免这种异常的发生,因为在集成开发环境中这种异常为编译时异常。这是基本的思路。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!