一、接口
1、基本概念
接口不是类,而是对类的一组需求进行描述,这些类要遵从接口描述的统一格式进行定义,接口通常以Interface来声明,它是抽象方法的集合。
如:
interface A{//定义一个接口
public static final String MSG = "Simon";//全局常量
public abstract void print();//抽象方法
}
接口中只能存在静态常量和抽象方法。
2、接口的使用
由于接口里面存在抽象方法,所以接口对象不能直接使用关键字New直接进行实例化。
2.1使用原则
①接口必须要有子类,但此时一个子类可以使用implements关键字实现多个接口。
②接口的子类(如果不是抽象类),那么必须要覆写接口中的全部抽象方法。
③接口对象可以利用子类对象向上转型进行实例化。
范例:
interface A{//定义一个接口A
public static final String MSG = "hello";//全局常量
public abstract void print();//抽象方法
}
interface B{//定义一个接口B
public abstract void get();
}
class X implements A,B{//X类实现了A和B两个接口
@Override
public void print() {
System.out.println("接口A的抽象方法print()");
}
@Override
public void get() {
System.out.println("接口B的抽象方法get()");
}
}
public class TestDemo {
public static void main(String[] args){
X x = new X();//实例化子类对象
A a = x;//向上转型
B b = x;//向上转型
a.print();
b.get();
}
}
除了可以实现接口外,还可以继承抽象类
class 子类 [extends 父类] [implemetns 接口1,接口2,...] {}
NOTE:
对于接口,里面的组成只有抽象方法和全局常量,为了书写简单,可以不用写 public abstract 和public static final,接口中的访问权限只有一种:public,即:定义接口方法和全局常量的时候就算没写上piblic,那么最最终的访问权限也是public
2.2
从接口的概念上来讲,接口只能由抽象方法和全局常量组成,但是内部结构是不受概念限制的,正如抽象类中可以定义抽象内部类一样,在接口中也可以定义普通内部类、抽象内部类和内部接口(但从实际的开发来讲,用户自己去定义内部抽象类或内部接口的时候是比较少见的)
interface A{
public void funA();
abstract class B{//定义一个抽象内部类
public abstract void funB();
}
}
在接口中如果使用了static去定义一个内接口,它表示一个外部接口:
interface A{
public void funA();
static interface B{//使用了static,是一个外部接口
public void funB();
}
}
class X implements A.B{
@Override
public void funB() {
}
}
三、接口的形象表示
四、接口与抽象类的比较
1、抽象类可以提供成员方法的实现细节,而接口中只能存在public abstract 方法;
2、抽象类中的成员变量可以是各种类型的,而接口中的成员变量只能是public static final类型的;
3、接口中不能含有静态代码块以及静态方法,而抽象类可以有静态代码块和静态方法;
4、一个类只能继承一个抽象类,而一个类却可以实现多个接口。
五、默认方法
使用default修饰符为接口提供一个默认的方法实现。
public interface Comparable<T>
{
default int compareTo(T other) {
return 0;
}
}
作用:默认方法的一个重要作用就是接口演化,当一个接口增加其它方法时,为了防止已经实现该接口的类编译报错,需要添加默认方法(实现接口时需要实现里面的全部方法,否则会报错)
六、解决默认方法冲突
1、超类优先
若一个类扩展了一个超类,同时实现了一个接口,并从超类和接口继承了相同的方法,在这种情况下,只会考虑超类的方法,接口中的所有默认方法都会被忽略。
2、接口冲突
当实现的两个接口都提供同名的默认方法时,需要在实现接口的类上重写该方法,确定要实现哪个接口的方法。
class Student implments Person,Named
{
oublic String getName{
return Person.super.getName();
}
}