4.1 类的抽象和扩展
继承是从已有类派生出新的类,新的类称为子类,已有类称为父类或超类。
子类有父类的数据和行为。
继承是一种"is-a"关系。
Java只支持单继承,不支持多继承(避免了使用多继承时出现的复杂问题)。
Java中只有Object没有父类,其他每个类都有一个直接的父类。
如果一个类没有指定父类,则它的父类默认是Object。Object类定义了一些类公有的行为。
4.2 继承的定义
4.2.1 语法格式
继承的一般格式:
[类的修饰符]class 子类名 extends 父类名{
...
}
使用extends 父类名 表示要继承的父类。
4.2.2 构造器与实例化
子类和父类属于两个不同的语句块,属于两个不同的作用域。
子类可以访问父类的成员,
子类和父类的成员都由自己的构造器完成初始化。
子类进行初始化时,会调用父类的构造器,可以用super(参数列表)指定使用哪个父类的构造器。
对象 instanceof 类
判断左边对象是否是右边类的实例。
4.2.3 super的使用
super除了当成构造器来用之外,还可以作为作用域使用。
4.2.4 继承关系下的作用域(第3章已有,略)
4.3 方法的覆盖
1.多态 根据对象实际类型调用相应的方法
2.final修饰符修饰的方法不能被覆盖,final修饰的类(class)不能被继承。
3.使用@Override覆盖方法可以让编译器做语法检测
4.子类的override方法的修饰符能弱于父类的方法。
5.子类的override方法的异常列表中的异常类不能多于父类的异常列表中的异常类型。
4.4 类型转换
子类可以赋值给父类;父类可以通过强制类型转化赋值给子类,但前提是这个父类对象实际上是一个子类对象,否则在使用时会出错。
4.5 根父类:Object类
Java中所有的类都继承自Object类.
Object类为所有类提供了基本的属性和方法,是类的高度概括。
Object提供了一个缺省构造器和一组基本方法:
方法 | 作用 |
protected Object clone() | 克隆 |
boolean equals(Object obj) | 判断相等 |
protected void finalize() | 析构 |
Class<?> getClass() | 返回运行时类型 |
int hashCode() | 返回对象的hash码 |
void notify() | 唤醒当前对象监视的等待线程 |
void notifyAll() | 唤醒当前对象 |
void wait() | 让当前线程等待 |
void wait(long timeout) | 让当前线程等待timeout毫秒 |
void wait(long timeout, int nanos) | 让当前线程等待timeout毫秒+纳秒 |
String toString() | 将对象转换成字符串,println打印对象时会自动调用。 |