041_面向对象_14_继承_super
一、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类、但是在集成开发环境中可以避免这种异常的发生,因为在集成开发环境中这种异常为编译时异常。这是基本的思路。