java笔记15:面向对象-接口
1.接口
1)什么是接口
接口也是java中的一种数据类型
刚接触接口时,可以将接口
看做是特殊的抽象类
2)为什么需要接口
因为java中允许一个类
实现多个接口
从而间接的实现java中的多继承
3)怎么样定义接口
将定义类的class关键字替换为
interface即可
4)编写一个接口
4.1)在接口中编写属性
这个属性会变为公有静态常量
既被public static final修饰的
4.2)在接口中定义方法
这个方法会变为公有抽象方法
既被public abstract修饰
4.3)在接口中编写静态方法
public static 方法名 [throws 异常列表]
由于Java中可以同时实现多接口,
如果2个接口同时存在同名,同参数的静态方法
则同子类.静态方法,将不知道访问哪一个。
因此不允许使用【子类.父类静态方法】形式访问,也不能通过【super方法.父类静态方法】访问
只可以父类名访问静态方法
InterA interA = new CImpl();
InterA.method(); //只可以父类名访问静态方法
4.4)在接口中编写默认方法
- JDK8之后允许存在默认方法
//default不能省略
public default void defaultMethod(){
}
- 子类重写接口默认方法时,必须去掉default。
@Override
public void defaultMethod(){
System.out.println("子类A中的默认方法,必须去掉default修饰符");
}
接口默认方法注意事项
- java中允许类实现多个接口,这就可能造成默认方法冲突。
- 当一个类实现多个接口时,如果多个接口中的默认方法冲突时,编译器会提示我们接口冲突,让我们自行解决(子类必须其中一个接口的方法)
- 当一个接口实现另一个接口时,子接口与父接口存在相同的默认方法时,将采用父类接口的默认方法
- 当一个类既继承父类又实现接口时,如果父类中的方法与接口中的默认方法冲突,将会执行父类中的方法,而不是接口中的方法,这种情况被称为类优先选择,方便兼容jdk8之前的版本
子类实现多个接口时,如果存在同名的默认方法,子类将不知道继承哪一个,因此编译器要求子类必须重写父类中的默认方法;不过注意的是,子类不能用default修饰,default只能修饰接口中的默认方法。
5)实现一个接口
定义一个类实现一个接口
要重写接口中的所有方法
除非这个类是抽象类
class Aoo implements <接口名>{
}
// 如果这个类有继承父类
class Aoo extends Boo
implements <接口1>,<接口2>,<接口N...>{
}
一个类可以实现多个接口
接口名之间用,分隔
6)使用接口的原则
- 使用继承的原则是符合is-a的关系
- 使用接口的原则是符合has-a的关系
7)使用接口类型调用方法
- 实例化实现类对象赋给接口引用也是向上造型
- 接口类型的引用只能调用到接口中声明的方法
8)使用接口的注意事项
8.1)接口可以继承接口
使用extends关键字, 继承多个接口用,分隔
- 8.2)接口特别适合用于设计 程序中的各种功能 这个设计的过程称之为 面向接口编程 就是只写接口不写实现
- 8.3)工作中的接口 就是今天我们的工作任务
// 面向接口示例
interface AAA{
boolean login(String name,String pwd);
List getUsers();
void addUser(User u);
...
...
}
public class AAAImpl implement AAA{
}
作业
定义接口Fly飞
接口中方法flying();
定义接口Swim游泳
接口中方法swimming();
定义抽象父类Bird鸟
编写抽象方法layEggs()
定义Sparrow麻雀类
继承Bird实现Fly接口
定义Duck鸭子类
继承Bird实现Fly和Swim接口
定义Bat蝙蝠类
实现Fly接口