目录
接口的概念
-
什么是接口?
-
接口就是一种公共的规范标准,只要符合标准,大家都能使用
-
Java的接口更多的体现的是对行为的抽象
-
接口不是类
-
-
接口的定义
-
接口的定义用关键字interface
public interface Compareble{ ... }
-
接口的属性(特点)
-
接口绝不会有实例字段
-
接口只有方法的定义,方法的实现交给实现接口的类
-
接口本身就是一个抽象的内容,不能被实例化,但可以用多态的形式,用实现类对象的方式实现实例化,这是接口多态,接口变量必须引用实现了这个接口的类对象
-
接口没有构造方法
-
接口的成员特点:
-
接口中定义的所有方法都是抽象的公共方法(publci abstract)
-
接口中定义的属性都是公共的静态的常量(public static final),这样一来就能直接通过接口名访问常量
-
类和接口的关系
-
类和接口之间的关系
-
类可以实现接口
-
类实现接口的步骤
-
将类声明为实现给定的接口
-
对接口中的所有的方法进行定义(类在实现接口的时候必须将类中重写的方法写为public)
-
-
-
类实现接口时必须重写接口中的方法
-
一个类可以实现多个接口(间接的实现了多继承)
-
还可以在继承一个类的同时实现多个接口
-
-
接口和接口之间的关系:
-
继承关系
-
单继承
-
多继承
-
-
检查类是否实现了某个接口用instanceof:
-
在Java中有一个很重要的内置接口,名为Cloneable,如果某个类实现了这个接口,Object类中的clone方法就能创建德4你的类对象的一个准确副本。如果希望自己实现的类有克隆和比较的能力只要实现这个接口就行了
class Employee implements Interface1.Cloneable
接口与抽象类
-
抽象类可以实现接口,并且可以不重写接口中的方法,但是抽象类的子类必须要重写接口的方法
-
接口和抽象类的区别:
-
成员区别:
-
抽象类:有变量,常量;构造方法;有抽象方法,有非抽象方法
-
接口:有常量,抽象方法
-
-
设计理念的区别:
-
抽象类:对类抽象,包括属性,行为
-
接口:对行为抽象,主要是行为
-
-
接口与多态的扩充
-
多态的形式:
-
具体类多态
-
抽象类多态
-
接口多态
-
-
多态的前提:
-
有继承(类与类)或者实现(类与接口)关系;
-
有方法重写;
-
有父类引用指向子类对象,或者有接口引用指向实现类对象
-
接口的私有方法
-
在Java9之后接口中的方法也可以是private。private方法可以是静态方法或者实例方法。
-
由于私有方法只能在接口内部本身的,所以它的用法很有限,只能作为接口中其他方法的辅助方法
默认方法
-
可以为接口提供一个默认实现的方法,必须要用default修饰符标记这样一个方法 图9
-
默认方法只有在有些情况有用处,因为实现类的每一个具体实现都会覆盖这个方法,不过有些时候默认方法很有用。
-
如果实现该接口的类不显示的提供该方法的具体实现,就会从接口中默认继承该默认方法
-
当然,实现类可以覆盖这个方法
-
Java8中常见的默认方法:
-
Collection.stram()
-
List.sort()
-
解决默认方法冲突
-
由默认方法就引出来一个问题:
如果先在一个接口中定义了一个默认方法,然后又在超类和另一个接口中定义了同样的方法,会发生什么情况
-
规则如下:
-
超类优先:如果超类提供了一个具体的方法,那么同名而且有相同参数类型的默认方法会被忽略
-
接口冲突:如果一个接口提供了一个默认方法,另一个接口也提供了一个方法(不管是不是默认方法),实现类都必须覆盖这个方法来解决冲突
-
如果两个接口都没有默认实现,那这里就不存在冲突,程序员可以在实现类中实现这个方法,或者让抽象类实现接口,从而在抽象类中不实现接口的方法,但是抽象类的子类必须去实现接口的方法
-
Comparator接口
-
可以对一个字符串数组排序,因为String类实现类4了Comparable<String>,而且compareTo方法可以按字典顺序比较字符串
-
假设我们希望按照长度对字串进行排序,肯定不能让String类用两种不同的方式实现compareTo方法,况且我们也不能修改String欸4类,要处理这种情况,Arrays.sort还有第二个版本,有一个数组和比较器作为参数,比较器是实现了Comparator接口的类
-
Comparator接口 图
-
如果要按长度比较字符串,可以定义一个实现此接口的类
-
具体完成一个比较时,需要建立一个实例
-
需要对一个数组排序时,需要用Arrays.sort方法传入一个LengthComparator对象
-
可以根据长度来对数组进行排序
类名作为形参或者返回值
-
当方法的形参是抽象类名时,其实参数需要的是该抽象类的子类对象
-
方法的返回值是抽象类名时,其实返回的时该抽象类的子类对象
接口名作为形参和返回值
-
方法的形参时接口名时,其实参数需要的是该接口的实现类对象
-
方法得返回值是接口名,其实返回的时接口的实现类对象
参考书籍:Java核心技术 卷1(原书第11版)