接口和内部类为我们提供了一种将接口与实现分离的更加结构化得方法。
Java提供抽象方法的定义,通过 abstract
关键字定义抽象方法,抽象方法只要声明没有方法主体。
abstract void f()
包含抽象方法的类叫做抽象类。如果一个类包含一个或者多个抽象方法,该类必须被限定为抽象类。
如果一个类继承了抽象类,那么必须实现抽象类的所有抽象方法,并且抽象类没有实例对象。
接口是java的一种抽象类型,是抽象方法的集合。接口比抽象类更加抽象的抽象类型。接口通常以interface来声明。一个类通过继承接口的方式,从而来继承接口的抽象方法。
a.在接口中可以添加使用 default 关键字修饰的非抽象方法。即:默认方法(或扩展方法)
b.接口里可以声明静态方法,并且可以实现。
相同点:
1)都是抽象类型;
2)都可以有实现方法(以前接口不行);
3)都可以不需要实现类或者继承者去实现所有方法,(以前不行,现在接口中默认方法不需要实现者实现)
不同点:
1)抽象类不可以多重继承,接口可以(无论是多重类型继承还是多重行为继承);
2)抽象类和接口所反映出的设计理念不同。其实抽象类表示的是”is-a”关系,接口表示的是”like-a”关系;
3)接口中定义的变量默认是public static final 型,且必须给其初值,所以实现类中不能重新定义,也不能改变其值;抽象类中的变量默认是 friendly 型,其值可以在子类中重新定义,也可以重新赋值。
4) 接口中没有构造器和初始化块。
接口可以通过extends关键字继承另一个接口,并且可以 继承多个基类接口 ,只需要使用逗号间隔开。
接口可以嵌套在类里面,可以拥有public和“包访问”两种可视性。嵌套接口还可以是private的。