第五章 子类与继承
5.1 子类与父类
继承是一种由已有的类创建新类的机制。
利用继承我们可以先创建一个共有属性的一般类,根据该一般类再创建具有特殊属性的新类,新类继承一般类的状态和行为,并根据需要增加它自己的新状态和行为。
由继承而得到的类称为子类,被继承的类称为父类(超类)
java 不支持多重继承,即子类只能有一个父类,但是一个类可以有0或多个子类(就像每个人只有一个亲爸爸,一个人可以不生子女,也可以生多个(这里不考虑人的生育能力问题))
5.1.1 声明子类
使用extends来定义一个类的子类
5.1.2 类的树形结构
java 的类按继承关系形成树形结构,这个树形结构中,根节点是Object类(Object类是java.lang中的类),即Object类是所有类的祖先类
如果一个没有生命extends关键字,这个类被默认是Object类的子类
5.2 子类的继承性
5.2.1 子类和父类在同一包中的继承性
如果子类和父类在同一包中,子类自然的继承了其父类中不是private的成员变量和方法作为自己的成员变量和方法,被继承的成员变量和方法的访问权限保持不变
5.2.2 子类和父类不在同一包中的继承性
如果子类和父类不在同一包中,子类继承了其父类的protected、public的成员变量和方法作为自己的成员变量和方法,被继承的成员变量和方法的访问权限保持不变
5.2.3 继承关系的UML图
5.3 子类与对象
5.3.1 子类对象的生成
子类创建对象时,子类的构造方法总是先调用父类的某个构造方法,完成父类部分的创建,再调用子类自己的构造方法,完成子类的创建
如果子类的构造方法没有明显的指明使用父类哪个构造方法,子类就调用父类的不带参数的构造方法
子类在创建一个子类对象时,不仅子类中声明的成员变量被分配了内存,而且父类的所有成员变量也都分配了内存,但子类只能操作继承的那部分成员变量
结论
5.4 成员变量的隐藏和方法的重写
隐藏(变量的重写)
对于子类可以从父类继承的成员变量,只要子类中声明的成员变量和父类中的成员变量同名时,子类就可以隐藏继承的成员变量
隐藏之后的变量,无法被子类操作
方法的重写(方法的隐藏)
子类定义的一个方法与父类的方法的类型一致,或是父类方法类型的子类型,且方法的名字、参数个数、参数类型和父类的方法完全相同
重写的目的
隐藏掉继承的方法,子类通过方法的重写可以把父类的状态和行为改变为自身的状态和行为
重写方法后调用的是子类重写的方法
未重写则调用的是子类继承的方法
5.5 super关键字
1、用super操作被隐藏的成员变量和方法
子类可以隐藏从父类继承的成员变量和方法,如果在子类中想使用被子类隐藏的成员变量或方法就可以使用关键字super。比如super.x , super.play()就是访问和调用被子类隐藏的成员变量x和方法play()
2、使用super调用父类的构造方法
子类不继承父类的构造方法,因此,子类如果想使用父类的构造方法,必须在子类的构造方法中使用,并且必须使用super关键字来表示,而且super必须是子类构造方法中的头一条语句。
5.6 final关键字
final关键字可以修饰类、成员变量和方法中的局部变量
可以使用final将类声明为final类。final类不能被继承,不能有子类,如果用final修饰父类中的一个方法,那么这个方法不允许子类重写
如果成员变量或局部变量被修饰为final,就是常量
5.7 对象的上转型对象
假设,A类是B类的父类,当用子类创建一个对象,并把这个对象的引用放到父类的对象中时,称对象a是对象b的上转型对象
比如
5.8 继承与多态
多态性就是指父类的某一个方法被子类重写时,可以各自产生自己的功能行为
5.9 abstract类和abstract()方法
用关键字abstract修饰的类称为abstract类(抽象类)
用关键字abstract修饰的方法称为abstract方法(抽象方法)
abstract类有如下特点
和普通类相比,abstract类里可以有abstract方法,也可以没有,对于abstract方法,只允许声明,不允许实现,而且不允许使用final修饰abstract方法
对于abstract类,不能使用new创建该类的对象,只能产生其子类,由子类创建对象
如果一个类是abstract类的子类,它必须具体实现父类所有的abstract方法
理解抽象类
1)抽象类可以抽象出重要的行为标准,该行为标准用抽象方法来表示。即抽象类封装了子类必需要有的行为标准
2)抽象类声明的对象可以成为其子类的对象的上转型对象,调用子类重写的方法,即体现了类根据抽象类里的行为标准给出具体的行为
5.10 面向抽象编程
在设计一个程序时,可以先声明一个abstract类,通过在类中声明若干个abstract方法,表面这些方法在整个系统设计中的重要性,方法体的内容细节由它的非abstract子类去完成
然后利用多态实现编程,使用多态进行程序设计的核心技术是使用方法重写和上转型对象,即将abstract类声明对象作为其子类的上转型对象,那么这个上转型对象就可以调用子类重写的方法
所谓面向抽象编程,是指当设计某种重要的类时,不让该类面向具体的类,而是面向抽象类,即所设计类中的重要数据是抽象类声明的对象,而不是具体类声明的对象
5.11 开-闭原则
让设计的系统对拓展开放,对修改关闭