继承是java面向对象编程技术的一块基石,因为它允许创建分等级层次的类。
继承就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例域和方法,或子类从父类继承方法,使得子类具有父类相同的行为。
继承的概念
- 继承是类与类之间的一种关系
- 使用已存在的类的定义作为基础建立新的类
- 新类的定义可以增加新的数据或新的功能,也可以用父类的功能,但不能选择性地继承父类。
- 当两个类之间满足 “A is a B” 的关系,我们就说它们满足继承关系
继承的特点
- 利于代码复用
- 缩短开发周期
语法
- 使用 extends 实现继承
- Java 只支持单继承,一个类只能有一个父类(也称为超类、基类)
继承后的初始化顺序
父类的静态成员
子类静态成员
父类对象构建【属性(赋值)、构造代码块、构造方法】
子类对象构建【属性(赋值)、构造代码块、构造方法】
Super关键字
如何区分调用的是继承父类的方法还是子类自己重写的方法?
访问父类成员方法
1
super.print();
访问父类属性
1
super.name;
子类对象实例化时,能否选择父类的构造形式(调用指定的构造方法)?
访问父类构造方法
1
2super();//无参的构造方法
super("name");//有参的构造方法子类的构造过程中必须调用其父类的构造方法,默认调用无参的构造方法
如果子类构造方法中既没有显示标注,而父类有没有无参的构造方法,则编译出错
使用 super 调用父类指定构造方法,必须在子类的构造方法的第一行
this 关键字 & super 关键字
| this 关键字——当前类对象的引用 | super 关键字——父类对象的引用 |
|---|---|
| 访问当前类的成员方法 访问当前类的成员属性 访问当前类的构造方法 不能再静态方法中使用 |
访问父类的成员方法 访问父类的成员属性 访问父类的构造方法 不能再静态方法中使用 |
构造方法调用时,super 和 this 不能同时出现
重写 & 重载
| 方法重写 | 方法重载 |
|---|---|
| 在满足继承关系的子类中 方法名、参数个数、顺序、返回值与父类相同 返回值类型与父类的返回值类型向下兼容 访问修饰符的限定范围大于等于父类方法 |
在同一个类中 方法名相同 参数个数、顺序、类型不同 返回值类型、访问修饰符任意 |
方法重写存在,属性重写不存在
Object 类
Object 类是所有类的父类
一个类没有使用 extends 关键字明确标识继承关系,则默认继承 Object 类(包括数组)
Java 中的每个类都可以使用 Object 中定义的方法
Object 类的常用方法
| 方法 | 说明 |
|---|---|
| toString() | 返回当前对象本身的有关信息,按字符串对象返回 |
| equals() | 比较两个对象是否是同一个对象,是则返回true |
| hashCode() | 返回该对象的哈希代码值 |
| getClass() | 获取当前对象所属的类信息,返回Class对象 |
final关键字
final 表示“最后的、最终的”含义,变量一旦赋值后,不能被重新赋值。被 final 修饰的实例变量必须显式指定初始值。
- 被 final 修饰的类表示不允许被继承
- 被 final 修饰的方法表示不允许被子类重写
- final 修饰的方法可以被继承
- 不能修饰构造方法
- 被 final 修饰的变量表示不允许被修改
- 方法内部的局部变量 —> 在使用之前被初始化赋值即可
- 类中的成员变量 —> 只能在定义时或者构造代码块、构造方法中进行初始化设置
- 基本数据类型的变量 —> 初始赋值之后不能更改
- 引用类型的变量—>初始化之后不能再指向另一个对象,但指向的对象的内容时可变的
- 不能修饰构造方法
- 可配合 static 使用,表示静态的、不允许被修改的信息
- 使用 final 修饰可以提高性能,但会降低可扩展性
注解
可以声明在包、类、属性、方法、局部变量、方法参数等的前面,用来对这些元素进行说明、注释
按照运行机制分
- 源码注解
- 编译时注解
- 运行时注解
按照来源分
来自 JDK 的注解
来自第三方的注解
自定义注解