内容:
1、接口的概念与定义
2、类实现接口
3、接口的特点
4、接口和抽象类的区别
1、接口的概念与定义
(1)类和接口
类:具有相同属性和功能的事物集合
接口:接口是功能的集合,也就是方法的集合,也就是说接口中只能定义方法,不能定义普通的成员变量
而且接口中的成员方法必须都是抽象的,可以理解接口是比抽象类更加抽象的一种类
(2)接口的定义
定义类的关键字:class
定义抽象类的关键字:abstract
定义接口的关键字:interface
定义接口所在的仍为.java文件,虽然声明时使用的为interface关键字的编译后仍然会产生.class文件,
这点可以让我们将接口看做是一种只包含了功能声明的特殊类
格式如下:
1 public interface 接口名{ 2 // 成员变量: 不能定义普通的成员变量 3 // 成员方法: 必须都是抽象 4 public abstract 返回值类型 方法名(); 5 }
使用interface代替了原来的class,其他步骤与定义类相同:
- 接口中的方法均为公共访问的抽象方法
- 接口中无法定义普通的成员变量
(3)各种类型之间的关系
- 类和类之间:继承,只能是单继承,一个子类只能有一个父类
- 接口和接口之间:继承,可以多继承,一个子接口可以有多个直接父接口
- 类和接口之间:不叫继承,叫实现(implements),可以多实现,一个类可以实现多个接口
2、类实现接口
类与接口的关系为实现关系,即类实现接口。实现的动作类似继承,只是关键字不同,实现使用implements
其他类(实现类)实现接口后,就相当于声明:”我应该具备这个接口中的功能”。实现类仍然需要重写方法以实现具体的功能
格式:
1 class 实现类 implements 接口 { 2 // 重写接口中所有方法 3 }
在类实现接口后,该类就会将接口中的抽象方法继承过来,此时该类需要重写该抽象方法,完成具体的逻辑
- 接口中定义功能,当需要具有该功能时,可以让类实现该接口,只声明了应该具备该方法,是功能的声明
- 在具体实现类中重写方法,实现功能,是方法的具体实现
于是,通过以上两个动作将功能的声明与实现分开,此时请思考:类是现实事物的描述,接口是功能的集合
3、接口的特点
接口中成员的特点如下:
- 接口中可以定义成员变量,但是变量必须用public static final修饰(固定修饰符),这样的变量其实是常量,其值不能改变
- 接口中可以定义方法,方法也有固定的修饰符,public abstract
- 接口不可以创建对象(抽象类也不可以创建对象)
- 实现类必须覆盖掉接口中所有的抽象方法后,实现类才可以实例化。否则实现类是一个抽象类
示例代码:
1 // 接口 2 public interface MyInter { 3 // 接口的成员变量(常量) 4 public static final int a = 3; 5 // 接口的方法 6 public abstract void show(); 7 }
注:固定修饰符可以不写也可以按心情想写哪个写哪个,但是不写不代表没有,不写时编译器会自动添加
在开发中最常用的模式:
1 // 一个类继承一个抽象类 同时实现多个接口 2 public class A extends AbstractClassB implements 接口A, 接口B{ 3 4 }
注:A中必须重写抽象类中的抽象方法以及所有接口中的抽象方法!
接口的特点:
- 接口可以继承接口 A接口继承B接口后,A接口便拥有了A、B两个接口中所有的抽象方法
- Java支持一个类同时实现多个接口,或一个接口同时继承多个接口
- 类可以在继承一个类的同时,实现多个接口
- 接口与父类的功能可以重复,均代表要具备某种功能,并不冲突
4、接口和抽象类的区别
相同点:
- 都位于继承的顶端,用于被其他类实现或继承
- 都不能直接实例化对象
- 都可以包含抽象方法,其子类都必须覆盖重写或实现这些抽象方法
区别:
- 抽象类为部分方法提供实现,避免子类重复实现这些方法,提高代码重用性;
- 接口只能包含抽象方法,而抽象类可以包含抽象方法也可以包含普通方法;
- 一个类只能继承一个直接父类(可能是抽象类),却可以实现多个接口;(接口弥补了Java的单继承)
- 抽象类为继承体系中的共性内容,接口为继承体系外的扩展功能
二者的选用:
- 优先选用接口,尽量少用抽象类
- 需要定义子类的行为,又要为子类提供共性功能时才选用抽象类