1.继承
* 子类=派生类
* extends 维护子父类间的关系
* java 一个类只能继承一个父类,这种方式叫做单继承。
* java中如果你类没有出现extends关键字,默认继承object顶级超类、 根类
* 子类可以继承父类的成员属性和成员方法,但是不包括构造方法
* protected 修饰的属性在同包下可以访问
* 为什么子类调用构造函数前必须调用父类的构造函数???【解答】因为子类继承了父类的成员变量,而子类中构造函数变量赋值会和父类构造函数的赋值产生代码重复,所以使用super()调用父类的构造函数。
2.继承属性
* 如果父类有某个属性,而子类刚好也一个一模一样的属性,子类访问时,访问的是子类的属性,如果子类没有这个属性,那么访问父类的属性, 这个特性叫:属性隐藏
* 如果子类非得去获取父类的属性,可以通过super去获取,注意super 只能在类的内部使用
* 子类继承父类的属性和方法,但是,无法继承父类private 修饰的方法或属性
* 子类也继承了父类的静态属性
3.继承方法
* 子类可以继承父类的静态方法
* 子类不能重写父类的静态方法
4.继承+成员变量
如果子类里没有包含和父类同名的成员变量,那么在子类实例方法中访问该成员时,则无需显式使用super或者父类名作为调用者,如果在某个方法中访问名为a的成员变量,但没有显式指定的调用者,系统查找顺序是:
1. 查找该方法中是否有a的局部变量
2. 查找当前类是否包含a的成员变量
3. 查找a的直接父类是否有含有名为a的成员变量,依次上溯a的所有父类,直到Object类为止,如果都没有找到,报错。
开发习惯:建议调用属性或方法显示指出调用者,处于运行效率的考虑
5.继承+构造函数
* 子类初始化(创建对象)时,首先调用父类的构造器,生成父类对象,然后在进行子类初始化
* 子类new 对象的时候,必须调用父类构造函数
* 如果父类无法提供子类所需要的构造函数
* 这时会报错:父类自定义带参数的构造函数,而子类使用默认的构造函数(无参数的)
* 最佳的解法:自定义类时,自定义一个空参数的构造函数(养成习惯)
* 可以通过,super进行调用父类的构造函数,进行初始化父类属性
* 构造函数不能被子类继承
6.继承+接口
* 一个子类可以同时继承抽象类和实现接口
* 一个接口可以继承自另一个接口
* java中不允许类的多继承,但允许接口的多继承
* 抽象类可以实现接口
* 接口不能继承抽象类
* 都是通过对象的多态性来实现的