继承、接口与多态
继承
继承是类与类之间父与子的关系。子类继承父类,通过super()调用父类构造方法、super关键字调用父类成员方法。
** 在实例化子类对象时,会先实例化父类对象 **
在实例化子类对象时,父类无参构造方法会被自动调用,有参构造方法则不会,super()就是用于调用父类有参构造方法实例化父类对象。
在子类调用finalize()的最后一个动作要调用父类finalize()方法。
执行顺序:(静态代码块和静态变量谁在前面就先执行谁)
父类静态代变量
父类静态代码块
子类静态变量
子类静态代码块
父类非静态变量(父类实例成员变量)
父类构造函数
子类非静态变量(子类实例成员变量)
子类构造函数。
方法重载:相同方法名,根据参数顺序、类型和个数,与返回类型和访问权限无关
接口与抽象类
接口解决的问题:
避免了不必要的抽象方法(有些抽象方法不是每个子类都希望实现,这时应该把它们提取出来做成接口,按需实现)
多重继承
当试图实例化抽象类时,会要求实现抽象方法,类似于匿名内部类。
当父类引用实例指向子类对象(向上转型)时,实例只能够调用父类方法;但是如果子类重写了父类方法,实例就默认调用子类重写后的方法!
面试题:接口与抽象类的区别
相同点
(1)都不能被实例化 (2)接口的实现类或抽象类的子类都只有实现了接口或抽象类中的方法后才能实例化。
不同点
(1)接口只有定义,不能有方法的实现,java 1.8中可以定义default方法体,而抽象类可以有定义与实现,方法可在抽象类中实现。
(2)实现接口的关键字为implements,继承抽象类的关键字为extends。一个类可以实现多个接口,但一个类只能继承一个抽象类。所以,使用接口可以间接地实现多重继承。
(3)接口强调特定功能的实现,而抽象类强调所属关系。
(4)接口成员变量默认为public static final,必须赋初值,不能被修改;其所有的成员方法都是public、abstract的。抽象类中成员变量默认default,可在子类中被重新定义,也可被重新赋值;抽象方法被abstract修饰,不能被private、static、synchronized和native等修饰,必须以分号结尾,不带花括号。