跳至主要內容

继承

Yang大约 3 分钟JavaJava基础

一种类与类之间的关系,使用已存在的类的定义作为基础建立新类,新类(子类、派生类)的定义可以增加新的数据或新的功能,也可以用父类(基类)的功能,但不能选择性的继承父类

  • 子类会继承父类所有 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 后不允许被重写,不加则被视为子类的静态方法
上次编辑于:
贡献者: sunzhenyang