1. 接口
1.1 JDK8以前的接口特点
- 接口就是一种公共的规范标准,只要符合规范标准,大家都可以通用。
- 接口存在的意义:1. 制定规则;2. 扩展程序
- 接口用关键字interface修饰:public interface 接口名 {}
- 实现接口用implements表示:public class 类名 implements 接口名 {}
- 接口中的成员变量: 默认被public,static,final修饰
- 接口中没有构造方法,实现类中的super( )访问的是Object的构造方法
- 接口中所有的成员方法都为抽象方法,默认被public,abstract修饰。因为没有具体的方法体,所以实现类可以实现多个接口(JDK7及以前版本特点)
1.2 JDK8、9中接口新特点
JDK8及以后版本只对接口中的成员方法做了改进。
解决了接口升级问题:
如果接口升级了,定义许多新的抽象方法,那么所有的实现类都需要去重写新的抽象方法,这样十分麻烦。为了解决接口升级的问题,JDK8中允许接口中拥有非抽象方法即默认方法。
- 默认方法格式:public default 返回值类型 方法名(参数列表) { }
- 默认方法不是抽象方法,所以在实现类中不强制重写默认方法。在实现类中,默认方法可以被调用和重写,重写的时候去掉default关键字,默认被 public修饰可以省略public。
- 实现类如果实现了多个接口,并且多个接口中存在相同的默认方法声明,子类就必须对该默认方法进行重写,否则会出现逻辑混乱。
引入了静态方法:
- 静态方法格式:public static 返回值类型 方法名(参数列表) { }
- 接口中的静态方法只能通过接口名调用,不能通过实现类名或者对象名调用。(所以不同接口中相同的静态方法不用在实现类中重写)
JDK9中接口的新特性:
Java 8允许在接口中定义带方法体的默认方法和静态方法。这样可能就会带来一个问题:当两个默认方法或者静态方法中包含一段相同的代码实现时,程序必然考虑将这段实现代码抽取成一个共性方法,而这个共性方法是不需要让实现类使用的,因此可以使用private修饰,这就是JDK 9增加的私有方法。
- 格式1:private 返回值类型 方法名(参数列表) { }
- 格式2:private static 返回值类型 方法名(参数列表) { }
1.3 接口使用的思路
- 如果发现一个类中所有的方法都是抽象方法,那么就可以将该类定义为一个接口。
- 如果接口大面积增加新的方法,而不想去修改每一个实现类,那么就可以将新的方法,定义为带有方法体的默认方法。
- 如果希望默认方法调用的更加简洁,可以将方法定义为静态方法,直接使用接口名调用即可。
- 如果默认方法中出现了重复代码,可以将重复代码抽取为一个私有方法,不允许实现类调用。
1.4 类和接口的关系
- 类与类之间的关系:继承关系。只能是单继承,不能多继承。
- 类与接口的关系:实现关系。可以单实现,也可以多实现,还可以在继承一个类的同时实现多个接口。当接口与父类有相同方法时,优先使用父类方法。
- 接口与接口的关系:继承关系,可以单继承,也可以多继承。(若多个父类有相同的方法声明,则必须重写父类方法)接口的实现类必须重写子接口和所有父接口的抽象方法。
2. 多态
多态即同一个对象,在不同时刻表现出不同的形态
多态的前提条件:
- 有继承或者实现的关系存在
- 子类或者实现类有重写方法的存在
- 父类的引用指向子类的对象(通过父类引用在堆内存中可以找到子类的对象)
多态中成员访问的特点:
- 成员变量:编译看父类,运行看父类(多态对象只能调用父类成员变量,不能修改)
- 成员方法:编译看父类,运行看子类(多态对象调用方法时,编译看父类有无此方法,运行时使用子类重写的方法)
多态的优缺点:
- 优点:提高程序的扩展性。定义方法时候,使用父类型作为参数,可以接收所有子类类型。(方法返回值为父类,也可以返回各种子类类型)
- 缺点:多态对象(子类)不能调用自己特有的方法,只能调用重写的父类方法。
多态中的转型:
- 向上转型:父类引用指向子类对象就是向上转型(将子类对象赋值给父类引用,类似于自动类型提升)
- 向下转型:子类型 对象名 = (子类型)父类引用(类似于强制类型转换)此用法易出现ClassCastException异常。
- 关键字 instanceof:变量名 instanceof 类型 判断关键字左边的变量,是否是右边的类型,如果是则返回true。
3. 化信息管理系统
- 若一个抽象类中方法全是抽象方法,可以将抽象类定义为一个接口。
- 若想解除不同类之间的耦合性,可以将创建某个类对象的代码在另一个类中的方法中实现。
- 定义方法时候,使用父类型作为参数,可以接收所有子类类型
- 方法返回值为父类,也可以返回各种子类类型
(具体代码在我的资源中,信息管理系统 v4.0)
如有错误欢迎留言评论,及时更正。 羽露风 5月24日