继承
大约 3 分钟
一种类与类之间的关系,使用已存在的类的定义作为基础建立新类,新类(子类、派生类)的定义可以增加新的数据或新的功能,也可以用父类(基类)的功能,但不能选择性的继承父类
- 子类会继承父类所有
public
类型的实例变量和方法,但不会继承父类所有的private
类型变量和方法
初始化顺序
父类静态成员 > 子类静态成员 > 父类对象构造 > 子类对象构造
访问修饰符不影响成员加载顺序,跟书写位置有关
特点
- 利用代码复用
- 缩短开发周期
- 单继承:子类只能继承一个父类
- 父类的私有成员子类不可继承
- 父类的构造方法不允许被继承,不允许被重写
- 子类构造方法默认调用父类的无参构造
格式
class Animal{
}
class Dog extends Animal{
}
super
表示父类对象的引用
调用父类可访问的属性
调用父类方法
调用父类指定构造方法,要放在子类构造方法的 第一行
子类的构造过程中必须调用其父类的构造方法
如果子类的构造方法中没有显示标注,则系统 默认调用父类的无参构造方法
- 此时如果父类没有无参构造,则会产生编译错误
不能在静态方法中使用
不能与
this()
共存
// 调用父类属性
super.month;
// 调用父类方法
super.eat();
// 调用父类构造方法
super();
super(name, month);
final 关键字
- 修饰类:表示该类不允许被继承,
public
final
关键字顺序可颠倒public final class Animal{}
- 修饰类方法:表示该方法不允许被子类重写,不能用来修饰构造方法
public final void eat(){}
- 修饰方法内局部变量:只要在具体使用之前进行赋值即可,一旦赋值不允许被修改
final int num; num = 10;
- 修饰内部成员属性:若定义时未被初始化,则只能在构造函数或构造代码块中赋值
private final String name;
- 修饰对象,对象的引用不可变,但对象的属性值可变
- 可配合
static
使用修饰方法和变量public static final int num = 10;
- 只需要加载一次后续不需要修订的配置信息
final
修饰的静态变量值必须在声明或静态初始化程序中赋值
- 可提高性能,但会降低可扩展性
Object 类
是所有类的父类
一个类没有使用 extends 关键字明确标识继承关系,则默认继承 Object 类(包括数组)
每个类都可以使用 Object 类中定义的方法
方法重写
- 在子类中定义,重写父类中的方法
- 方法名和参数列表(类型、个数、顺序)与父类完全一致,与方法参数名无关
- 父类中的静态方法不能被子类重写
- 父类和子类具有相同名称的静态方法时,当子类对象向上转型后,只能调用到父类原有的静态方法
- 方法的返回值和访问修饰符是允许有变化的
- 如果父类方法的返回值是
void
或 基本数据类型,则要求子类方法重写时返回类型与父类完全一致 - 如果父类方法的返回值是引用类型,则要求子类方法重写时返回类型与父类一致或为父类类型的子类
- 访问修饰符:子类重写方法的访问修饰符访问范围要大于等与父类的访问范围
- 如果父类方法的返回值是
final
修饰的方法不允许被重写static
修饰的方法- 加了
@Override
后不允许被重写,不加则被视为子类的静态方法
- 加了