继承
特点: - 提高了代码的复用性; - 让类与类之间产生了关系. 有了这个关系, 才有了多态的特性; - Java 中只支持单继承, 不支持多继承, 因为继承容易带来安全隐患
重写(覆盖)
-
当子类中出现和父类一模一样的函数时, 当子类对象调用该函数, 会运行子类函数的内容, 如同父 类的函数被覆盖一样.
-
当子类继承父类, 沿袭了父类的功能, 到子类中, 但是子类具备该功能, 但是功能的内容却和父类 不一致, 这时没有必要定义新功能, 而是使用覆盖, 只保留父类的功能定义, 并重写功能内容.
-
子类覆盖父类, 必须保证子类权限大于等于父类权限, 才可以覆盖, 否则编译失败.
-
静态只能覆盖静态
-
如果父类中的方法权限为=private=, 则子类无法重写该方法.
重写和重载的区别
- 重载: 只看同名函数的参数列表
- 重写: 子父类方法要一模一样
子父类中构造函数的特点
|
|
以上程序的运行结果为 Father run | Son run |
;
- 子类中的构造函数第一行会隐式的存在一句
super()
默认调用父类中默认的构造方法; - 如果父类中没有默认的构造方法, 可以在子类构造方法中的第一行通过
super(xxx)
手动的来指定父类中特定的构造函数;
注意
super()
语句一定是在子类构造函数的第一行
|
|
- 以上代码会出现编译错误, 错误原因为 =recursive constructor invocation=意思为 ‘构造器中出现了递归调用, 这是不被允许的’;
final 关键字
- final: 最终. 作为一个修饰符;
作用及特点
- 可以修饰类, 函数, 变量;
- 被
final
修饰的类不可以被继承; 为了避免被继承, 被子类复写功能; - 被
final
修饰的方法不可以被复写; - 被
final
修饰的变量是一个常量且只能赋值一次;final
既可以修饰成员变量, 又可以 修饰局部变量, 当在描述事物时, 一些数据的值是固定的, 那么这时为了增强阅读性, 都给这些值 起个名字, 方便与阅读; - 内部类定义在类中的局部位置上时, 只能访问局部被
final
修饰的局部变量;
抽象类(abstract) {#抽象类 abstract}
- 特点:
- 抽象方法一定定义在抽象类中;
- 抽象方法和抽象类都必须被
abstract
关键字修饰; - 抽象类不可以用
new
创建对象, 因为调用抽象方法没有意义; - 抽象类中的方法要被使用, 必须由子类复写其所有的抽象方法后, 建立子类对象调用, 如 果子类只覆盖了部分抽象方法, 那么该子类还是一个抽象类
- 抽象类和一般类的区别:
- 抽象类比一般类多了个抽象函数, 就是在类中可以定义抽象方法;
- 抽象类不可以实例化;
- 特殊: 抽象类中可以不定义抽象方法, 可以使该类不创建对象;
abstract
只可以修饰类和方法, 不能修饰变量;
接口
接口定义时的格式特点: - 接口转中常见定义: 常量, 抽象方法; - 接口中的成员变量都有固定修饰符: 1. 常量:=public static final= 2. 方法:=public abstract=
- 接口是不可以创建对象的, 因为接口中有抽象方法 -
接口需要被子类实现子类对接口的抽象方法全部覆盖后, 子类才可以实例化 - 接口可以被类多实现, 也是对不支持多继承的转换形式, Java 支持多实现;
接口与接口之间可以实现多继承
|
|
注意: 接口与接口之间的继承中, 被继承的接口中不能含有名字相同, 返回值不同的方法;
|
|