知识盲点汇总
1. 多态
-
多态中,编译看左边,运行看右边
-
多态的前提是继承
-
要有方法的重写
-
父类引用指向子类对象,如:Animal a = new Dog(); -- 小到大,向上转型
什么可以被重写?
-
普通成员方法
(由于存在重写, 所以调用了父类的方法声明, 使用了子类的方法体) -
(由于不存在重写, 所以直接使用父类的)成员变量
-
(静态资源随着类地加载而加载, 重写的静态方法和父类的静态方法不是同一个类, 所以不是重写)静态方法
多态的好处
- 可以把不同的子类对象当做父类来看, 可以屏蔽不同子类对象之间的差异, 写出可以通用的代码, 做出通用的编程.
- 统一调用的标准, 一切向父类看齐
- 提高了程序的扩展性和可维护性
2.抽象类
抽象类可实现多态. 关键字: abstract
-
使用abstract关键字的方法为抽象方法
注意: 如果这个类有抽象方法, 那么这个类也必须是抽象类, 用
abstract
修饰. 抽象类里面可以有普通方法 -
子类如果继承了抽象的父类, 子类两条路: 把所有抽象方法都重写 或者 是一个抽象子类
-
抽象类本身不能创建对象, 但是为什么提供构造方法? 是为了子类创建对象时调用.
-
抽象类中可以拥有成员变量和常量
3.final关键字
- 父类被final修饰后, 变成了最终的类, 不能被继承.
- 当变量被final修饰后, 就成了常量, 值不能被修改.
- 当方法被final修饰后, 就成了最终方法, 不能被重写.
4.接口
接口是一种特殊的抽象类, 也可以实现多态. 关键字: interface
-
接口没有构造方法
-
实现接口之后必须重写所有的抽象方法, 或者这个类必须是抽象类.
-
接口没有成员变量, 但是可以有常量(接口里的变量值不能修改)
即使你在接口里这么写:
String name = "张三"
这么写, 它也默认是final
和static
修饰的 (可以截至使用类名点进行调用) -
接口里不可以有普通方法
-
接口中的抽象方法可以省略
public
和abstract
关键字例如:
interface Inter { // 以下这两种写法是一样的, 接口中可以省略public和abstract // public abstract void show(); // void show(); }
-
接口中的方法重写时, 要有足够的权限, 如果接口里都是
public
, 重写的时候权限必须要比public
要大, 或者为public
才可以 -
JDK1.8之后(包括JDK1.8) 接口扩展 (不常用)
default
修饰的方法可以有方法体, 并且接口的实现类可以进行重写, 重写之后调用实现类的方法体, 否则调用接口中的方法体.static
修饰的方法根普通的静态类一样, 实现类不可以重写, 可以直接使用接口名点进行调用
5.接口复杂用法
-
接口和接口之间是继承关系才可以关联
示例:
// 创建接口1 interface Mapper1 { void save(); void get(); } // 创建接口2 interface Mapper2 { void add(); void update(); } // 接口和接口之间是继承关系 (Mapper3 继承了 Mapper1 和 Mapper2中的方法) interface Mapper3 extends Mapper1, Mapper2{ }
上例中: 如果一个实现类实现了Mapper3接口, 那么需要重写Mapper1, Mapper2, Mapper3中的所有抽象方法
-
实现类和接口使用
implements
一个类可以实现多个接口, 例如:
class Impl2 implements Mapper1, Mapper2 { // 重写 Mapper1 和 Mapper2 这两个接口的抽象方法都重写 }
-
实现类也可以继承一个类的同时实现多个接口. 必须是先继承父类再实现接口, 有先后顺序