接口

来源:互联网 发布:必佳软件 编辑:程序博客网 时间:2024/04/28 03:28

接口

1)非抽象类实施了接口后,必须要重写该接口内的所有方法;如果不完全重写接口内的方法的话,必须将该类声明为抽象类。

2)接口相当于某个类的超类,所以接口的作用是声明并使用该接口类型的变量,而非声明某个特定的实施了该接口的具体类(比如要定义一个通用的实施了Comparable接口的数组的排序方法sort,这时,参数类型应当为Comparable)。

3)声明为接口类型的变量(引用),只能访问接口所声明的成员,不能访问实施了该接口的类的其他成员。如果要访问其他成员,必须要把该引用强制类型转换为该类的类型。但是,该引用可以调用Object的任何public方法,原因是每个没有父接口的接口,都会自动声明一组与Object对象的public方法相同的方法(除非该接口显式地重写这些方法)。

4)接口的修饰符可以为public[缺省,只能在同一个包内访问]abstract[可以省略]

1.     声明接口

接口的成员:

1)常量[字段]

2)方法

3)嵌套类/嵌套接口

接口的成员缺省是public的,因此public被省略了。

接口中的常量:

接口中的常量的缺省修饰符是public static final,一般省略。

必须要初始化这些字段,仅声明不初始化是不允许的。

可以使用嵌套的枚举类来表示常量字段。

如果要使用共享的、可修改的字段,可以使用一个引用(该引用值是不变的),该引用所指的对象含有数据。嵌套类能够很好的胜任此项任务。

接口中的方法:

接口中的常量的缺省修饰符是public abstract,一般省略,而且接口方法只能是这个修饰,其他的修饰符不能再修饰接口方法了。

[static表明类有实体,而abstract是不能生成实例的。native, synchronized, or strictfp涉及实现细节,abstract仅是声明;final不能被继承,abstract必须被继承,矛盾。]

2.     继承接口

[public] interface A extends B, C, D{

}

接口支持多重继承。

继承并隐藏常量[字段]

接口的字段是常量,是static的,所以,子接口无法重写,如果有同名的标识符的话,则隐藏父接口常量。

访问特定的常量可以使用“具体的接口名.常量名”,示例:

interface X {

    int val = 1;

}

interface Y extends X {

    int val = 2;

    int sum = val + X.val; // sum = 2 + 1 ;

}

class Z implements Y { }

System.out.println("Z.val=" + Z.val + ", Z.sum=" + Z.sum); // z.val = 2 , z.sum = 3

Z z = new Z();

System.out.println("z.val=" + z.val + //z.val = 2

                   ", ((Y)z).val=" + ((Y)z).val + // ((Y)z).val= 2

                   ", ((X)z).val=" + ((X)z).val); // ((X)z).val= 1

这些规则同类继承中static字段访问性是一致的。

多重接口继承后,同名字段的歧义性

interface A { int a = 0 ;}

interface B { int a = 1 ;}

interface C extends A , B{ }

那么C.a会产生歧义性,编译器报错,只能通过A.aB.a来访问。

对于实施了多个接口的类而言,上述问题也存在。

继承、重写、重载方法

子接口继承了父接口所有的方法,如果子接口中有签名与父接口中方法一致的方法,那么子接口中的方法重写父接口中的方法,但是在接口中,方法重写是毫无意义的,因为每个实施该接口的类,对于那个方法只有一个实现。

       同样,子接口继承了(或类实施了)多个拥有相同签名的方法(如,C 继承了 ABAB中分别有一个相同签名的方法),那么子接口仅仅继承一个这样的方法。实施这个接口的类最终确定了实现这个同签名的方法。如果同签名的方法的返回值不同,那么其中的一个返回值类型一定是其他返回值类型的子类型,否则编译器报错,那么实施这个接口的类必须实现返回值为公共子类型的那个方法。

       同样,子接口中重写的方法不能抛出多于父接口中方法的异常。如果子接口继承了多个签名相同的方法,但是这些方法throws子句不同,那么实施该子接口的类在实现这个方法时,必须满足所有的throws子句抛出的异常。

       重载方法,签名不同。如果仅仅返回值不同,签名相同,那么编译器报错。

3.     接口与抽象类

接口提供了多继承的方法,因为一个类可以实施多个接口;然而,类仅仅能继承一个类,即使那个类只有一个抽象方法。

抽象类可以有一些实现部分,可以有protected成员和static方法等等。而接口的成员局限于没有实现的public常量和public方法。