1.接口概念:
接口可以理解为一种特殊的类,由全局变量和公共的抽象方法组成。
类是一种具体实现体,而接口定义了某一批类所需要遵守的规范,接口不关心这些类的内部数据,也不关心这些类里方法的实现细节,他只规定这些类里必须提供某些方法。
接口是一种引用数据类型
2.接口定义:使用interface关键字
接口定义的基本语法:
[修饰符] (abstract) interface 接口名 [extends 父接口1,父接口2...] //接口可以多继承,也可以不继承,给接口起名时在最前面加个I以示区分
{
零个到多个常量定义...
零个到多个抽象方法的定义...//接口中的方法只能是抽象方法;接口中方法不能有方法体即{}
}
注意:接口就是用来被继承实现的,修饰符一般用public,不能使用private和protected
3.接口成员
全局变量:接口中的属性是全局常量,即使定义时不添加public static final 修饰符,系统也会自动加上。
方法:接口中的方法只能是抽象方法,即使定义时不添加public abstract修饰符,系统也会自动加上。
注意:接口里面没有写上public,其最终访问权限也是public,绝不是default,为了防止出现覆写接口方法时降低访问权限的错误,强烈建议在定义接口方法时一定写上public。
4.接口使用
一个类可以实现一个或多个接口,实现接口使用implements关键字。java中一个类只能继承一个父类,不够灵活,可以通过实现多个接口进行补充。
实现接口的类,必须覆写接口中的全部抽象方法
继承父类、实现接口的语法:
[修饰符] class 类名 extends 父类 implements 接口1,接口2...
{
类体部分//如果继承了抽象类需要实现继承的抽象方法;如果接受了一个接口,就要实现接口中的抽象方法
}
注:如果要继承父类,继承父类必须要在实现接口之前。
接口是一种引用数据类型。 当你定义一个新的接口时,你其实在定义一个新的引用类型 。 在你能使用数据类型名称的地方,都可以使用接口名称。如果你定义了一个类型为接口的引用变量,该变量能指向的对象所在的类必须实现了该接口。 (类似于抽象类的使用,因为抽象类或者接口里面的抽象方法没有被实现,不能直接被调用,所以不能直接实例化)(If you define a reference variable whose type is an interface, any object you assign to it must be an instance of a class that implements the interface. )
eg.//用一个接口的引用指向一个实现了接口的类对象(类似于抽象类的使用)。这样这个对象既可以是自己本身的类(或父类)类型,又可以是该接口的类型。
X x = new X();//实例化实现接口的类对象
A a = x;//向上转型
B b = x;//向上转型
a.print();
b.get();
虽然接口里从概念上来说只能有全局变量和抽象方法,但是所有的内部及结构是不受这些限制的,即在接口里面可以定义普通内部类、抽象内部类、内部接口。
eg .在一个接口内部如果使用static去定义一个内部接口,相当于 定义了一个外部接口。【了解即可】
interface A {
public void funA();
static interface B{//static修饰的内部接口,相当于一个外部接口
public void funB();
}
}
class X implements A.B{//调用内部接口要用“外部接口.内部接口的”方式,即A.B
public void funB(){} //X只需覆写接口B的抽象方法
}
接口在使用过程当中,还经常与匿名内部类配合使用
匿名内部类就是没有名字的内部类,多用于关注实现而不关注实现类的名称。
语法格式:
Interface i = new Interface(){
public void method(){
System.out.println("匿名内部类实现接口的方式");
}
}
eg.
1.先new,再调用
IPlayGame ip = new IPlayGame(){ //最后 } 要加 ;
@Override
//在内部类中实现接口的方法
public void playGame(){
System.out.println("使用匿名内部类的方式实现接口");
}
};
ip.playGame(); //可通过接口调用方法
2. 直接new 然后调用
new IPlayGame(){
@Override
//在内部类中实现接口的方法
public void playGame(){
System.out.println("使用匿名内部类的方式实现接口2");
}
}.palyGame();
5.接口与抽象类
一个抽象类可以去继承一个抽象类,但是反过来,一个接口却可以用extends关键字同时继承多个接口(但是接口不能继承抽象类)。
eg.
public interface A {
public abstract void print();
}
public interface B {
public abstract void get();
}
public interface C extends A, B { //接口C继承接口A、B
public abstract void fun();
}
public class X implements C { //X实现了接口C,则必须覆写A、B、C中所有的抽象方法
public void get() {
System.out.println("B接口的抽象方法");
}
public void print() {
System.out.println("A接口的抽象方法");
}
public void fun() {
System.out.println("C接口的抽象方法");
}
}
6.接口在实际开发中的三大核心作用:
定义不同层之间的操作标准;
表示一种操作的能力;
表示将服务器端的远程方法视图暴露给客户端。