1.接口特点
接口不是被类继承了,而是被类实现了
①.有时必须从几个类中派生出一个子类,继承他们所有的属性和方法。但是,java不支持多重继承。有了接口,就可以得到多重继承的效果。
②.接口是抽象方法和常量值的定义的集合。
③.接口实质上是一种特殊的抽象类,这种抽象类中只包含常量和方法的定义(还必须只有抽象方法),而没有变量和方法的实现。
④.接口没有构造方法。
⑤.接口可以继承接口,使用extends关键字
⑥.接口的方法都是抽象方法,系统默认已经默认自动加上了public abstract修饰符,定义抽象方法时可以不加上抽象修饰符。接口的所有属性都是静态的常量,默认省略了static和final(都默认是由public static final隐式修饰的,已经自动加上了修饰符),属性的值必须实例化(初始化)。
2.接口与抽象类
①.如果一个类中,既有抽象方法,又有非抽象方法,那么这个类只能为抽象类,不能定义为接口。
②.如果一个类中,只有抽象方法,没有非抽象方法,那么这个类可以定义为接口。
③.接口中的所有方法都是抽象方法,所以可以说接口就是一个特殊的抽象类。
④.接口中除了定义方法外,还可以定义成员变量。
⑤.接口没有构造方法,而抽象类中有构造方法。
⑥.抽象类中的方法可以有方法体的实现,而接口中是不能有的(但是jdk8后接口里的某些方法可以有方法体,比如说static方法和default修饰的方法)
⑦. ⼀个类继承了⼀个抽象类,那么它必须全部覆写抽象类中的抽象⽅法,当然也可以不全 部覆写,如果 不覆写全部抽象⽅法则这个⼦类也必须是抽象类。一个类实现接口也同理,要么全部覆写接口中的抽象⽅法,要么这个类是接口。
⑧.接口不能继承抽象类
⑨.接口中的访问权限只有一种public。且定义接口时强烈建议在抽象方法前加上public。因为定义接口未加上public,一个类实现了接口,而这个类里没有使用public修饰时编译会报错
interface A{
String MSG = "hello";
void print();
}
class X implements A{
void print() {
System.out.println("接口A的抽象方法print()");
}
}
3.接口的用处
接口常常被用来当做定义常量的集合(接口中的常量,可以省略修饰public static final,抽象通常可以省略public abstract)
4.接口的实现implements,创建接口用interface
Java中一个类无法继承来自多个类,但是可以继承多个接口,是有关键字implements,多个接口之间使用”,”隔开,接口之间没有先后顺序。
继承多个接口的类称为实现类,这个类必须实现所有接口的所有方法
当类实现接口的时候,类要实现接口中所有的方法,不然类必须声明为抽象类,否则就要使用implements关键字实现所有接口。
语法
class 类名 implements 接口名称,接口名称,接口名称……{
//实现方法体
}
一个类只能继承一个类,但是能实现多个接口。
接口能继承另一个接口,用extends关键字继承。
子类除了实现接口外,还可以继承抽象类。若即继承抽象类,同时又实现接口。语法格式
class 子类 extends 父类 implements 接口1,接口2,…{}
5.接口虽然说只能由抽象方法和全局常量组成,但是内部结构不受限制。正如抽象类中可以定义抽象内部类一样,在接口中也可以定义普通内部类、抽象内部类和内部接口。
6.JDK1.8及1.8后的版本的接口
①.接口里的方法允许有方法体
②.接口中可以有static方法和default修饰的方法(default修饰的方法只能出现在接口中),且这两种方法都必须有方法体。static方法直接通过接口名.方法名调用
default方法如果在子接口或者子类重写,那么子接口实现对选哪个、子类对象在main函数测试时调用该方法,调用的以重写的方法为准。
④.子类或者子接口如果没有重写父接口的default方法,则在调用default方法时(在main()函数中调用时),调用的是父类定义的default方法
//static方法属于接口里的方法,相当于结构体里的属性,故使用接口名.方法名
Ipay.staticMethod();
//default⽅法必须通过实现类的对象调⽤
Apay apay = new Apay();
apay.defaultMethod();