继承Inheritance
将多个具有共同特点的对象抽象出一个”父类”.
父类中存储的是各个子类共同的特点[属性]或者功能[方法]
继承的好处 - 提高了代码的复用性.使用多态的前提,为了代码的可拓展性.
继承的缺点 - 增加了类与类之间的关系.不太符合软件的设计原则”高内聚,低耦合”
低耦合 - 模块与模块之间/类与类之间的关系应该越弱越好 - 没有关系
高内聚 - 单个模块/类能够独立完成某个业务功能的能力比较强.
实际开发中,可以采用设计原则**”合成复用原则”** - 来替代继承的使用.
使用extends关键字来表示某个类继承某个父类
比如:
public class A{ } public class B extends A{ } B 是 A的子类,A是B的父类,基类,超类. 1. A的父类就是java.lang.Object - 当某个类如果没有明确指定它的父类是谁,那么这个类默认继承Object 2. 子类是可以访问到父类中所有的非私有的成员 3. java的类只支持单继承.一个类只能继承一个父类.避免出现网状结构,保证类的层次性. java中的接口是支持多重继承.一个接口可以继承多个接口. 4. 继承具有传播性.C extends B B extends A C间接继承于A,C也是可以访问到A中的所有的非私有的成员 5. 不要滥用继承,前提B is A
super关键字
必须放在构造方法的首行
调用父类的构造
在子类的构造中,如果没有出现任何的super语句.那么系统默认会给定super(); - 调用父类的空参构造
当在子类中调用了一个和父类中同名的成员的时候,需要通过super关键字来加以区分[强制调用父类中那个同名的成员]
多态 - polymorphism
对象有多种形态.发生前提是具有继承关系
相同的消息可能会送给多个不同的类别之对象,
而系统可依据对象所属类别,引发对应类别的方法,而有不同的行为。简单来说,所谓多态意指相同的消息给予不同的对象会引发不同的动作。
instanceof
进行类型的判断,只有为true的时候,才能够进行类型的转换[强制,向下]
如果没有进行类型的判断,随便进行了一个强制类型转换,可能会抛出java.lang.ClassCastException类型转换失败异常
三种场景应用
面向父类编程
对象的编译时类型写成父类,对象的运行时类型写成子类
编译时类型 对象名 = new 运行时类型();
对象的编译时类型决定了对象的访问能力 - “对象名只能访问到编译时类型中定义的成员”
对象的运行时类型决定了对象的行为能力 - “子类中如果一旦重写了父类中的方法,那么运行期间调用的是子类重写之后的方法”
方法的参数类型写成父类,调用这个方法的时候,可以传入这个父类的任意一个子类对象
方法的返回类型写成父类,方法的返回结果可以是这个父类的任意一个子类对象 - “简单工厂设计模式”
final关键字
不可更改,不可变
- final修饰的变量/属性 - 不能够重新赋值
- final修饰的类 - 不能够被继承
- final修饰的方法不能够被重写.
修饰符
访问修饰符 - 决定了这个成员可以在哪里能够被访问.
所有包 | 子类[可以不同,同包] | 同包 | 本类 | |
---|---|---|---|---|
public 公共的,公开的 | √ | √ | √ | √ |
protected 受保护的 | × | √ | √ | √ |
默认的 | × | × | √ | √ |
private 私有的 | × | × | × | √ |
安全级别:private>默认的>protected>public
可见区域:public>protected>默认的>private
方法的重写
方法的重载和方法的重写有什么区别?
特点:
发生的前提是要有继承关系
- 重写有个特殊的场景 - 子类重写之后的方法的修饰符,返回类型,方法名,参数列表和父类中高度保持一致 - 重构
- 子类重写的方法的访问修饰符可以小于或者等于父类
- 方法名必须要一样.
- 子类重写的方法的返回类型可以小于[可以是父类方法的返回类型的子类类型]或者等于父类的那个方法
- 参数列表必须要高度保持一致