本文目录
- 第8章 继承
- 1. 继承
- 1.1 为什么要使用继承
- 1.2 继承的好处
- 1.3 继承的层次
- 1.4 super 关键字
- 2. 继承的使用
- 2.1 继承时的成员变量
- 2.2 继承时的构造方法
- 2.3 Java 中继承的使用
- 3. 方法重写
- 3.1 重写的概念
- 3.2 重载与重写
- 4. 继承关系下对象的初始化顺序
- 5. final 关键字
第8章 继承
1. 继承
1.1 为什么要使用继承
从已有的类派生出新的类,称为继承。
在不同的类中也可能会有共同的特征和动作,可以把这些共同的特征和动作放在一个类中,让其它类共享。
因此可以定义一个通用类,然后将其扩展为其它多个特定类,这些特定类继承通用类中的特征和动作。
继承是 Java 中实现软件重用的重要手段,避免重复,易于维护,易于理解。
1.2 继承的好处
- 提高了代码的可重用性
- 使类和类之间有了关系,从而实现多态
1.3 继承的层次
继承构成一种体系:
父类描述共性,子类描述个性,二者之间是 is a
的关系。
Java 中的继承是单继承。不支持多继承( C++
支持多继承),但支持多重继承。
1.4 super 关键字
super
:对父类的引用
作用:
- 在子类中显示调用父类的属性或方法
- 在子类的构造函数中显示指明调用父类的某个构造方法,并且该语句必须位于当前构造函数代码中的第一行
super 与 this 的区别:
2. 继承的使用
- 通过
extends
关键字,实现建立两个类之间的继承关系。 - 通过访问修饰符,可以实现哪些属性和方法能够被子类使用。
基本格式:
2.1 继承时的成员变量
子类可以继承父类中以 public
、protected
修饰的属性。不可以继承 默认(无修饰符)
、private
修饰的属性。
2.2 继承时的构造方法
继承关系下,子类创建对象的时候,一定会用到父类的构造函数,默认调用的父类无参构造函 数,可以通过 super
显示的定义调用父类的哪个构造函数。
如果在父类中显示定义了有参构造方法时,那么父类还必须显示的定义无参构造方法(此时因为已显示定义了有参构造函数,系统就不会再隐式的定义无参构造函数了,那么就需要开发人员手动显示定义无参构造函数了)。
2.3 Java 中继承的使用
一切对象继承于 Object
类。
Object
类中的方法:
- toString()
- equals()
- hashCode()
- clone()
- getClass()
- norify() / wait() / notifyAll() (与线程有关的方法)
作用:
- 保证所有的对象具备某些公共功能。
- 垃圾回收的实现也将变的容易一些。
3. 方法重写
3.1 重写的概念
重写是子类对父类的允许访问的方法的实现过程进行重新编写, 返回值和形参都不能改变。即外壳不变,核心重写!
规则:
- 参数列表与被重写方法的参数列表必须完全相同。
- 返回类型与被重写方法的返回类型可以不相同,但是必须是父类返回值的派生类(JDK 1.5 及更早版本返回类型要一样,JDK 1.5+ 及更高版本可以不同)。
- 子类方法不能缩小父类方法的访问权限。
- 子类方法不能抛出新的检查异常或者比被父类方法申明更加宽泛的异常。
- 父类的成员方法只能被它的子类重写。
- 声明为
final
的方法不能被重写。 - 声明为
static
的方法不能被重写,但是能够被再次声明。 - 子类和父类在同一个包中,那么子类可以重写父类所有方法,除了声明为
private
和final
的方法。 - 子类和父类不在同一个包中,那么子类只能够重写父类的声明为
public
和protected
的非final
方法。 - 重写的方法能够抛出任何非强制异常,无论被重写的方法是否抛出异常。但是,重写的方法不能抛出新的强制性异常,或者比被重写方法声明的更广泛的强制性异常,反之则可以。
- 构造方法不能被重写。
- 如果不能继承一个方法,则不能重写这个方法。
3.2 重载与重写
4. 继承关系下对象的初始化顺序
类加载的时候:执行静态相关的内容
- 父类:静态变量、静态初始化块
- 子类:静态变量、静态初始化块
运行期的时候:new
- new 父类对象:成员变量、构造初始化块、构造函数
- new 子类对象:成员变量、构造初始化快、构造函数
5. final 关键字
final
代表的是最终的,不可变的,出于设计和安全的考虑而存在的。
- final 修饰变量:常量,初始化后就不再被改变
- 成员变量
- 声明时便赋值,或者声明后在构造方法中赋值
- 静态成员变量声明时必须赋值,并且变量名全部大写
- 针对基本类型变量,值不可变
- 针对引用类型变量,引用不可变,引用所指向的对象是可变的
- 局部变量
- 不可变
final
修饰方法
- 不允许被重写
- 效率:内嵌使用
-
private
修饰的方法,隐式地被定义为 final 修饰的方法
- final 修饰类
- 不能被继承
认真、沉着做事,每天进步一小点!!!