接口定义
接口定义一种规范,规定某以类事物必须具备某些功能,但是它不管类如果具体实现这些功能.
格式:[修饰符] interface 接口名 extends 父接口1,父接口2...
public interface IWalkable{
void walk;
}
接口特点:
- 没有构造方法,不能实例化
- 接口只能继承接口,不能继承类,且接口支持多继承
- 接口里的方法全是抽象的,默认修饰符是public abstract
- 接口里的字段是全局静态变量,默认修饰符是public static final
- 接口里的类全部是静态的,默认修饰符是public static
接口里的成员包括(一般使用前两个):
- 全局静态变量:实现类中经常使用的通用常量
- 公共的抽象方法:实现类中必须实现的公告方法
- 公共静态内部类(包括内部类、内部接口、内部枚举)
提示:
可理解为接口是一种特殊类,习惯在接口名前加上大写的I,以区别分类和接口.
接口里定义的方法一般不写修饰符.
接口之间的多继承:
public interface IA{
void methodA();
}
public interface IB{
void methodB();
}
//接口IC的子类必须实现method和method
public interface IC extends IA,IB{
}
实现接口
接口是一种特殊的类,仅仅是定义了功能,必须有类去实现接口,才有意义。
格式:[修饰符] class 类名 implements 接口1、接口2
++实现接口(支持多实现):接口的实现必须在extends后;++
示例:
public class Tiger extends Animal implements IWalkable,ISwimable{
}
接口和实现类的关系,是一种继承关系,既实现类实现了接口。也可以称为是特殊的继承关系,实现类是接口的特殊子类,接口是实现类的特殊父类。
实现(覆写)接口的方法必须使用public访问修饰。
接口不能创建实例,但是可以声明引用类型的变量,此时,引用类型的变量必须指向到其实现类对象,其实就是父类变量引用子类对象。
IWalkable obj = new String();//错误
IWalkable obj = new Tiger();//多态
不建议一个实现类的多个接口里有同名字段和相同方法签名的方法。
提示:
- 接口也是一种类型,子类的实例可以使用instanceOf来判断.
- 父类和子类之间及接口和实现类之间的都可以描述多态,但是接口和实现类之间的多态才是我们开发中见到最多的情况.
public interface IWalkable{
void walk();
}
public interface ISwimable{
void swim();
}
public class Animal{
String name;
}
//Tigerl类继承Animal,实现IWalkable 和ISwimable
public class Tiger extends Animal implements IWalkable,ISwimable{
public void swim(){
}
public void walk(){
}
}
public class Test(){
public static void main(String[] args){
Tiger t = new Tiger();//实例化Tiger实例
t.swim();//tiger实现了ISwimable接口,所以Tiger有swim方法
Animal a = t;//Tiger是一种Animal,所以可以使用Animal类型引用
a.name = "tiger";//Animal 没有实现IWalkable和ISwimable,不能swim和walk
IWalkable w = t;//Tiger实现了IWalkable,所以能用IWalkable类型引用
}
}
接口VS抽象类
相同点:
- 都位于继承类的顶端,用于被其他子类或接口实现或继承
- 都不能实例化
- 都可以定义抽象方法,其非抽象子类必须覆写这些抽象方法
不同点
- 接口没有构造方法,抽象类有构造方法
- 抽象类可以包含普通方法和抽象方法,接口只能包含抽象方法
- 一个类只能继承一个直接父类(可能是抽象类),却可以实现多个接口(接口弥补了Java的单继承)
- 变量:接口里默认是public static final,抽象类是默认包访问权限.
- 方法:接口里默认是public abstract,抽象类默认是默认包访问权限
- 内部类:接口里默认是public static,抽象类默认是默认包访问权限
二者的选用
优先选用接口,尽量少用抽象类,若需要定义子类行为,又要为子类提供共性功能时选用抽象类。