基本概念
- 语法(extend)
- 被继承的类(超类、父类、基类)
- 继承的类(子类、派生类、孩子类)
- super:两种用法,调用父类的对应函数或构造器
super.xxx()
:调用超类中的函数super(n,s,year)
:调用超类中含有n、s、year参数的构造器的简写方式(必须是子类构造器的第一条语句)- ps:由于子类无法直接调用父类中私有变量,所以仅可以通过调用父类的构造器进行对应变量的初始化
super
和this
:this是一个对象的引用,可以将this赋予另一个对象变量,而super则不行,仅仅能是一个知识编译器调用超类方法的特殊关键字
- 调用父类超类具有的同名方法时,调用哪个对象的方法取决于调用对象的引用的对象类型,其中一个变量可以指示多种类型称为多态,运行时能够自动的选择调用父类还是超类的方法称为动态绑定
- 继承层次:由一个公共超类派生出来的所有类称为继承层次
多态
在Java中对象是多态的,一个Java变量可以引用它本身的对象,也可以引用它的任何一个子类对象
ps:不能将任何一个超类对象赋给子类对象变量
强制转换
将一个类型强制转换成另一个类型的过程称为强制转换
强制转换使用的原因:在暂时忽视对象的实际类型后,使用对象的全部功能
只能在继承层次内转换(一般是超类强制转换成子类)(注意如果谎报其实该对象没有该子类相关的内容,会发生ClassCastException异常报错)
- 超类转换成子类时,检验能否转换成功:
instanceof
操作符检测(if(xxx instanceof xx)xxxx;(如果xxx变量可以转换成xx对象) - ps:应该尽量少用类型转换和instanceof,而是应该多检查类方法结构写的好不好
抽象类
一般来说位于上层的类更加具有通用性,更加抽象,很多时候这种上层的类编写的时候仅仅是将它作为其他类的基类而不是生成实例的类,用抽象类就比较合适了
- 特点:不能被实例化(即使不含抽象方法,也可以定义为抽象类)
- ps:建议尽量将通用的域和方法(不管是不是抽象的)放在超类中
受保护的访问(protected)
表示子类受到信任,可以修改和获取父类中的pretected的变量
- ps:但是要谨慎的使用,因为若提供给他人使用他人就可以通过继承该类从而修改父类中的属性了
Object类
Object.md
关键词
final
final可以修饰类、方法、域
- 类:表示该类不能被继承(包括该类内的方法为final,但是类中的域不会加上final属性)
- 方法:表示该类的方法无法被子类覆盖
- 用途:确保该方法不会在子类中被改变语义
- 域:表示该域无法被修改
继承的设计技巧
- 1.将公共操作和域放在超类
- 2.不要使用受保护的域(不安全,容易被破坏封装性)
- 3.使用继承实现"is-a"关系
- 4.除非所有继承方法都有意义,否则不要使用继承
- 5.在覆盖方法时,不要改变预期的行为
- 6.使用多态,而非类型信息
- 7.不要过多的使用反射