继承
一、优点
- 减少了代码的冗余;
- 便于功能扩展;
- 为多态的使用提供了前提。
二、格式
class A extends B{}
A:子类、派生类、subclass
B:父类、超类、基类、superclass
2.1体现:一旦子类A继承了父类B,子类A中就获取了父类B中声明的所有的属性、方法。
特别的,父类中声明为private的属性或方法,子类继承父类后,仍然认为获取了父类中私有的结构,只是因为封装性的影响,使得子类不能直接调用父类的结构而已。
2.2子类继承父类以后,还可以声明自己特有的属性或方法,实现功能的扩展。
三、Java中关于继承性的规定
1.一个类可以被多个子类继承
2.Java中类的单继承性,一个类只能有一个父类
3.子父类是相对的概念
4.子类直接继承的父类叫直接父类,子类间接继承的父类叫间接父类
5.子类继承父类后,就获取了直接父类以及所有简介父类中声明的属性和方法
四、方法的重写
1.定义:在子类中可以根据需要对从父类中继承来的方法进行改造,也称为方法的覆盖、重置,在程序执行中,子类的方法将覆盖父类的方法。
2.格式:
权限修饰符 返回值类型 方法名(形参列表)throws 异常类型{
方法体;
}
3.注意:
(1)子类重写方法的方法名和形参列表与父类被重写的方法名和形参列表相同;
(2)子类重写的方法的权限修饰符不小于父类被重写的方法的权限修饰符; 特殊情况:子类不能重写父类中private的方法
(3)返回值类型
>父类被重写的方法的返回值是void,则子类重写的方法的返回值类型也只能是void
>父类被重写的方法的返回值类型是A类型,则子类重写的方法的返回值可以是A类或A类的子类
>父类被重写的方法的返回值类是基本数据类型(比如:double),则子类重写的方法的返回值必须是相同的基本数据类型(必须也是double)
(4)子类重写的方法抛出的异常类型不大于父类被重写的方法抛出的异常类型
五、super关键字
- 使用
-
- 可以理解为父类的;
- 可以用来调用:属性、方法、构造器
- 使用
-
我们可以在子类的方法或构造器中,通过使用”super.属性” 或”super.方法()”的方式,显式的调用父类中声明的属性或方 法。通常情况下我们习惯省略”super.”
特殊的:当子类和父类中定义了同名的属性时,我们想要在子类调用父类中声明的属性,则必须显式的使用”super.属性”的方式
-
-
- super调用构造器
-
- 我们可以在子类的构造器中显式的使用”super(形参列表)”的方式,调用父类中指定的构造器;
- super(形参列表)必须声明在子类构造器的首行;
- 我们在类的构造器中,针对”this(形参列表)”或”super(形参列表)”只能二选一,不能同时出现;
- 当我们在构造器的首行没有显式的声明”this(形参列表)”或”super(形参列表)”,则默认的调用的是父类中空参的构造器
六、子类对象实例化的过程
- 从结果上看:
子类继承父类以后,就获取了父类中声明的属性或方法;
创建子类的对象,在堆空间中,就会加载所有父类中声明的属性。
- 从过程上看:
当我们通过子类的构造器创建子类对象时,我们一定会直接或间接的调用其父类的构造器,进而调用父类的父类的构造器,直到调用java.lang.object类中的空参的构造器为止。正因为加载过所有的父类的结构,所以才可以看到内存中有父类的结构,子类对象才可以考虑进行调用。
明确:虽然创建子类对象时,调用了父类的构造器,但自始至终创建过一个对象,即为new的子类对象。