/* * 接口 * 引用数据类型: * 类,接口,数组; * * 接口是一种引用数据类型,可以看作是一个特殊的类,它存在的目的是为了解决没有多重继承引起的功能弱的问题而设计的,一个类只能有一个父类,但是这个类却可以实现多个接口; * * 接口还可以看作是只有抽象方法的类,即接口的所有方法都必须被实现; * 接口声明的关键字是interface,代替了class;而普通类的继承关键字extends也变成了implements(实现); * 但是其作用和普通类中是一样的,只不过是为了区分而已; * * * 1 定义接口的语法: * [修饰符列表] interface 接口名 { } * 2 接口中的内容: * 只能是常量(public static final 常量名)和抽象方法 * 3 抽象方法不需要abstract修饰,默认就是public的(不需要加) * 4 接口可以看作是一个特殊的抽象类,就是完全抽象的,没有普通的方法 * 5 接口中是没有构造方法的,也就是接口无法被实例化 * 6 一个类可以实现多个接口,但是只能继承一个类 * 7 一个非抽象类实现接口,需要将接口中所有的方法都实现(重写/覆盖) * 那抽象类实现接口呢? * 抽象类实现接口,可以实现任意个:0~N个 * 8 接口之间: * 可以继承,不仅如此,接口还可以多继承,相比来说,类只能单继承 * * 常量和静态数据的区别: * 都是在类加载的时候就初始化,但是静态数据可以进行多次赋值 * * 常量:一般都必须使用public static final修饰,在接口中声明常量,这些都是可以省略的; * 命名方式:大写字母加下划线的形式命名; * * 注意: 上述部分需要区分接口和接口间的"继承",类和接口间的"实现",类和类的"继承"; */ public class JavaSE{ public static void main(String[] args){ F f = new F(); f.m1(); f.m2(); f.m3(); f.m4(); } } interface A{//接口A public void m1(); } interface B{//接口B public void m2(); } interface C{//接口C void m3();//接口中方法的public是可以省略的; } interface D extends A,B,C{//接口的多继承 void m4(); } class MyClass implements B,C{//普通类对接口的实现 public void m2(){ System.out.println( "覆写B接口的m2()方法" ); } public void m3(){ System.out.println( "覆写C接口的m3()方法" ); } } abstract class E implements D{//抽象类对接口的实现 public static final int A = 10;//常量的声明方式 char C = '中'; public void m1(){ } public void m2(){ } public void m3(){ } public void m4(){ } } class F extends E{//需要覆写E中所有的方法 public void m1(){ System.out.println( "覆写m1()方法" ); } public void m2(){ System.out.println( "覆写m2()方法" ); } public void m3(){ System.out.println( "覆写m3()方法" ); } public void m4(){ System.out.println( "覆写D中的m4()方法" ); } }