概述
一方面,有时必须从几个类中派生出一个子类,继承他们的所有属性和方法。但是java中不支持多继承。引出接,接口可以实现多继承的效果
另一方面,有时必须从几个类中抽取出一些共同特征,而他们之间又没有is-a的关系,只具有相同的行为特征。例:摄像头、充电器、MP3 机、手机、数码相机都支持USB连接
接口就是规范,定义的是一组规则。继承体现的是一个"是不是"的关系,而接口则实现是"能不能"的关系。
接口的本质是标准,规范,指定好后大家都要遵守。
接口的特征
1.接口使用interface来定义
2.java中接口和类是并列的两个结构
3.如何定义接口:定义接口中的成员
3.1JDK7及以前:只能定义全局常量和抽象方法
全局常量:public static final的(可省)
抽象方法:public abstract的
3.2 JDK8:除了定义全局常量和抽象方法外,还可以定义静态方法,默认方法
4.接口中不能定义构造器
5.java开发中,接口通过让类去实现(implements)的方式来使用
如果实现类覆盖了接口中的所有抽象方法,则此实现类就可以实例化
如果实现类没有覆盖接口中所有的抽象方法,则此实现类仍为一个抽象类
6.java类可以实现多接口
格式:class A extends B implements C,D,E //继承父类并且实现接口
7.接口和接口之间可以继承,而且可以多继承
8.接口的具体使用,体现了多态性
9.接口,实际上可以看作是一种规范
为什么接口中只能定义常量?
如果接口定义的是变量的话,比如接口中我定义了变量a,而且我们通过实现本接口的类B的对象改变了a的值,那么其他实现本接口的类B、类C中的变量a得知都要随着改变(因为它们实现的都是一个接口,处理的也是同一个变量,而变量的处理方式为传址),那么就会造成想要实现本接口的类却不知道接口里现在变量a到底是什么值,就会造成混乱。
代码实现
public class InterfaceTest {
public static void main(String[] args) {
System.out.println(Flyable.MAX_SPEED);
System.out.println(Flyable.MIN_SPEED);
Plane plane = new Plane();
plane.fly();
}
}
//攻击性接口
interface Attackable{
void attrack();
}
//飞行接口
interface Flyable{
//全局常量
public static final int MAX_SPEED = 7900; //第一宇宙速度
int MIN_SPEED = 1; //省略了
//抽象方法
public abstract void fly();
//省略了
void stop();
}
//飞机类覆盖了接口中的所有抽象方法,则此飞机类就可以实例化
class Plane implements Flyable{
@Override
public void fly() {
System.out.println("飞机起飞");
}
@Override
public void stop() {
System.out.println("飞机减速停止");
}
}
//风筝类实现接口,没有覆盖接口中所有的抽象方法,它仍是一个抽象类
abstract class Kite implements Flyable{
@Override
public void fly() {
}
}
//子弹类实现攻击接口和飞行接口
class Bullet extends Object implements Flyable,Attackable{
@Override
public void attrack() {
// TODO Auto-generated method stub
}
@Override
public void fly() {
// TODO Auto-generated method stub
}
@Override
public void stop() {
// TODO Auto-generated method stub
}
}
//************************************************************
//接口多继承
interface A{
void method1();
}
interface B{
void method2();
}
interface C extends A,B{
}
接口的好处:
1.降低耦合度
2.提高程序的可扩展性
接口和抽象类的异同(面试题)
1.接口的方法默认是 public,所有方法都是抽象方法,在接口中不能有方法的实现(Java 8 开始接口方法可以有默认实现),抽象类可以有非抽象的方法
2.接口中的实例变量默认是 final 类型的,而抽象类中则不一定
3.一个类可以实现多个接口,但最多只能继承一个抽象类
4.一个类实现接口的话要实现接口的所有方法,而抽象类不一定
5.接口不能用 new 实例化,但可以声明,但是必须引用一个实现该接口的对象 从设计层面来说,
抽象类是对类的抽象,是一种模板设计,接口是行为的抽象,是一种行为的规范。