继承
- 继承:多个类中存在相同属性(成员变量)和行为(成员方法)时,将这些内容抽取到单独一个类中,那么多个类就无需再定义这些属性和行为了,只要继承那个类即可
- 通过extends关键字可以实现类与类的继承
class 子类名 extends 父类名{}
- 单独的类称为父类、基类或超类,子类也叫派生类,父类中的内容是多个子类重复的内容
- 继承的好处:1、提高了代码的复用性,多个类相同的成员可以放到同一个类中;2、提高了代码的维护性,如果功能的代码需要修改,只需要修改父类这一处即可;3、让类与类之间产生了关系,这是多态的前提(这也是继承的缺点),使得类的耦合性增强
- 开发的原则:低耦合、高内聚
- 继承的缺点:1、破坏了封装,子类与父类之间紧密耦合,子类依赖父类的实现,造成子类缺乏独立性;2、支持扩展,但是往往以增强系统结构的复杂度为代价;3、不支持动态继承,在运行时子类无法选择不同的父类;4、子类不能改变父类的接口
- 继承的特点:1、Java只支持单继承,不支持类的多继承,一个类只能有一个父类,不可以有多个父类;2、Java支持多层继承(继承体系)
1. class A{} 2. class B extends A{} 3. class C extends B{}
- 子类只能继承父类中所有非私有的成员方法和成员变量
- 子类不能继承父类的构造方法,但是可以通过super关键字去访问父类的构造方法
- 不要为了部分功能而去继承
- 在Java中,所有的继承都是公共继承
- 继承绝对不会删除任何字段或方法
- Object类是Java中所有类的父类,如果某个类没有明确地指出父类,那么Object类就被认为是这个类的父类,这个类就默认访问Object类的无参构造
在子类中访问一个变量的执行顺序:首先在子类的局部范围中找,然后在子类成员范围中找,最后在父类成员范围中找(不能访问到父类的局部范围),如果还是没有就报错
super关键字
- super有两个含义:1、调用父类的方法;2、调用父类的构造器
- 调用父类成员变量
super.成员变量
- 调用父类的构造方法(使用super调用构造器的语句必须是子类构造器的第一条语句)
super(参数)
- 调用父类的成员方法
super.成员方法
- 注:
- super不是一个对象的引用,不能将值super赋给另一个对象变量,它只是一个指示编译器调用父类方法的特殊关键字
- this代表本类对应的引用,通过其操作本类的成员,super代表父类存储空间的标识
继承中构造方法的关系
- 子类中所有的构造方法默认都会访问父类中的无参构造方法,因为子类会继承父类中的数据,可能还会使用父类的数据,所以子类初始化之前一定要先完成父类数据的初始化(先进行父类的初始化再进行子类的初始化,这叫分层初始化)
- 子类每一个构造方法的第一条语句都是super(),这是系统默认的,写不写都有,但如果父类没有无参构造方法,这时在子类中系统就不会自动调用父类的无参构造了,需手动调用父类的构造方法,不然会报错
继承使用场景
采用假设法:如果有两个类A、B,只要它们符合A是B的一种或者B是A的一种(A is B)或(B is A)这样的关系,就可以考虑使用继承
继承的设计技巧
- 通过父类定义子类时,只需要在子类中指出子类与父类的不同之处即可,将通用的字段和方法(不管是否是抽象的)都放在父类(不管是不是抽象类)中,而更特殊的方法就放在子类中
多态
- 多态:一个对象变量可以指示多种实际类型的现象(某一个对象在不同时刻表现出来的多种状态)
- 多态的使用前提:1、要有继承关系;2、要有方法重写;3、要有父类引用指向子类对象
父类名 f = new 子类名();
- 多态的好处:1、提高了代码的维护性;2、提高了代码的扩展性
- 向上转型
fu f = new zi();
- 向下转型
zi z = (zi)f;//要求该f必须是能够转换为zi的
多态中的成员访问特点
- 成员变量:编译看父类,运行看父类
- 成员方法:编译看父类,运行看子类(由于只有成员方法存在方法重写,所以它运行看子类)
- 静态方法:编译看父类,运行看父类(静态和类相关,算不上重写,所以访问的还是父类的)
- 动态绑定(后期绑定):在运行时能够自动的选择适当的方法,java中的动态绑定是默认行为,动态绑定是多态得以实现的重要因素
- 静态绑定(前期绑定):在程序执行前已经被绑定,即在编译过程中就已经知道这个方法是哪个类的方法,此时由编译器获取其它连接程序实现。在Java中,final、private、static修饰的方法以及构造函数都是静态绑定的,不需程序运行,不需具体的实例对象就可以知道这个方法的具体内容。