JDK1.8之后,接口的语法有改动
增加了两类成员
(1)静态方法:public static,static不可以省略的
通过“接口名.方法”来进行调用
接口的静态方法不会继承到实现类中,不能用接口的实现类对象调用,只能用接口名调用。
为什么这么设计呢?
因为原来的API中,往往会设计为这样:
(1)集合类的接口:Collection
集合的工具类:Collections
(2)文件
文件路径的接口:Path
工具类:Paths
**觉得没有必要为了这个接口在增加一个工具类,干脆把这些方法直接写到接口中,
减少.class 的文件的数量,减少API的类型的数量**
(2)默认方法:public default,default不可以省略的
通过实现类的对象进行调用。
说明:实现类可以对接口的默认方法进行重写。重写时,不需要加default。不然就错了
- 什么情况下用默认方法呢?
当这个接口的某个抽象方法,在很多实现类中的实现代码是一样的,那么可以吧这个实现挪到接口中,用默认方法进行实现
如果对该抽象方法不一样的实现的实现类,那么可以对该默认方法进行重写。
具体的演示代码见://默认抽象方法的使用
public class TestInterface {
public static void main(String[] args) {
MyInter.print();//直接接口名调用
MyImpl my = new MyImpl();
my.test();
my.method();
SubA sa = new SubA();
sa.a();
SubD ad = new SubD();
ad.a();
}
}
interface MyInter{
String INFO = "禾木";//全局静态常量
void test();//公共的抽象的方法
public static void print() {
System.out.println("接口的静态方法");
}
public default void method() {
System.out.println("接口的默认方法");
}
}
class MyImpl implements MyInter{
@Override
public void test() {
// TODO Auto-generated method stub
System.out.println("实现接口的抽象方法");
}
}
//默认抽象方法的使用
/*
*这个 a(); 在每一个的接口的实现类中都是一样的方法体,只有SnbD中不一样
*那么可以考虑的是把这个方法写成默认的方法,在实现类中,如果方法体相同的就不用
*在写一遍了,在实现类中如果方法体不同,重写一下就好了。
interface A{
void a();//抽象方法
}
class SubA implements A{
@Override
public void a() {
// TODO Auto-generated method stub
System.out.println("aa");
}
}
class SubB implements A{
@Override
public void a() {
// TODO Auto-generated method stub
System.out.println("aa");
}
}
class SubC implements A{
@Override
public void a() {
// TODO Auto-generated method stub
System.out.println("aa");
}
}
class SubD implements A{
@Override
public void a() {
// TODO Auto-generated method stub
System.out.println("dd");
}
}
*/
interface A{
public default void a() {
System.out.println("aa");
}
}
class SubA implements A{
}
class SubB implements A{
}
class SubC implements A{
}
class SubD implements A{
@Override
public void a() {
// TODO Auto-generated method stub
System.out.println("dd");
}
}