1.子类和父类的其他名称:
在一个已知类A的基础上,创建新类B的过程,称之为继承 这里类A,称为父类,基类,超类 这里类B,称为子类,派生类。
2.继承的概念:
向上抽取共性,把相同的内容定义在父类中。
3.继承的好处:
(1)提高了代码的复用性
(2)让类与类之间差生了关系(父子类的关系)
(3)是多态的前提
(4)子类可以使用父类的除private修饰的和构造方法以外的内容
4.继承的使用格式:
格式:
public class 父类 {
//成员变量
//成员方法
//构造方法
}
public class 子类 extends 父类 {
//成员变量
//成员方法
//构造方法
}
public class A extends B {
//...
}
5.继承中的成员变量访问特点:
1.不重名的成员变量
(1)子类自己有: 优先使用子类自己的
(2)子类没有: 找父类的
注意: 子类可以找父类,但是父类不能找子类
2.重名的成员变量
(1)方法内部,直接写变量名
从方法内部开始向上找
方法内部有: 直接使用
方法内部没有: 向上找,本类的成员位置
本类的成员位置有: 直接使用
本类的成员位置没有: 向上找,父类的成员位置
(2)方法内部,直接写this.变量名
从本类的成员位置开始向上找
本类的成员位置有: 直接使用
本类的成员位置没有: 向上找,父类的成员位置
(3)方法内部,直接写super.变量名
从父类成员位置开始向上找
父类的成员位置有: 直接使用
父类的成员位置没有: 继续向上找
(4)总结:就近原则
6.this以及super
7.继承中成员方法的访问特点
继承中成员方法的访问特点
1.子类自己有: 优先使用子类自己的
2.子类没有: 向上找父类
3.重名的方法(方法重写): 优先使用子类自己的
方法重写
1.概念:
子类中出现与父类一模一样的方法时(返回值类型,方法名和参数列表都相同),
会出现覆盖效果,也称为重写或者复写。声明不变,重新实现。
必要条件:方法名和参数列表必须相同
可选条件:返回值类型可以不一致,在引用类型时
2.最简单的方法重写形式:
子类方法声明(定义方法的第一行)和父类方法声明一模一样
3.@Override注解:用来检测子类方法,是否是对父类方法的覆盖重写
4.与方法重载区分开:
方法重载作用:是节约命名空间
方法重载要求: 方法名称相同,参数列表不同(类型不同,数量不同,多个不同类型的顺序不同)
8.方法重写的注意事项
1. 子类方法覆盖父类方法,必须要保证权限大于等于父类权限。
权限:
public > protected > default > private
2. 子类方法覆盖父类方法,
返回值类型、函数名和参数列表都要一模一样。
必要条件:
函数名和参数列表都要一模一样
可选条件:
返回值类型可以不一样
子类覆盖重写后的方法的返回值类型 <= 父类方法返回值类型
3. 私有方法不能被重写(父类私有成员子类是不能继承的)
9.继承中构造方法的访问特点
1.构造方法的名字是与类名一致的。所以子类是无法继承父类构造方法的
2.子类继承父类,是为了使用父类的内容,所以子类创建对象调用构造方法时,必须先调用父类的构造方法,完成父类成员的初始化动作,子类才可以使用父类的成员,super()表示调用父类的空参构造
3.子类的构造方法中如果没有手动给出super调用父类构造,
编译器默认提供一个super()调用父类的空参构造
4.super调用父类构造,只能写在第一句
5.构造方法可以重载,所以:
super(...):调用父类带参数的构造方法
10.抽象类的概念
1.概念:
说不清楚的,不够具体的,功能子类要有,但是具体如何实现,父类不管,子类自己决定
举例:
所有的动物都应该具备吃的能力,但是具体的怎么吃,吃什么,无法在父类中做统一规定,
但是吃的能力子类必须具备,具体如何实现,父类不管,子类自己实现/决定
2.抽象类中抽象方法存在的意义:强制要求子类必须具备的能力
11.抽象类的定义和使用
抽象类的定义格式:
public abstract class 类名 {
...
}
抽象方法的定义格式:
修饰符 abstract 返回值类型 方法名称(参数列表...);
注意:
(1)和以前定义方法一样,但是去掉{},添加abstract关键字
(2)返回值类型和参数列表根据需求确定
(3)含有抽象方法的类,必须定义为抽象类,但是抽象类中不一定含有抽象方法
抽象类的使用
(1)不能直接创建抽象类的对象
(2)定义子类,继承抽象父类
(3)子类中覆盖重写抽象父类中的所有抽象方法
去掉abstract关键字,添加{}
(4)创建子类对象
(5)子类对象调用方法