从学习了Java到现在差不多一年多了,中途穿插学了各种语言,这么久都没太用到接口,很让人惊讶,在最近看《深入Java虚拟机》的一个小知识点时(类的加载),看到一个例子,一个接口竟然能够直接通过 “接口名.接口成员变量” 来调用进行使用。我很惊讶!!为什么能直接调用,开始我还以为书写错了。最后才知道,我把我的知识都还给老师了 :( 不开心。。。
接口类型的定义类似于类的定义
接口定义的形式如下:
[修饰符 ] interface 接口名 [extends] [ 接口列表 ]
{
接口体
}
像类那样,编译好的接口被保存在 class二进制文件中。
1.接口说明
- interface 前的修饰符是可选的。当没有修饰符的时候,表示此接口的访问只限于同包的类。
- 如果使用修饰符,则只能用 public 修饰符,表示此接口是公有的,在任何地方都可以引用它,这一点和类是相同的。
- 接口说明中的 extends 关键词和类说明中的 extends 一样,用来定义直接的父接口。和类不同,一个接口可以继承多个父接口,当 extends 后面有多个父接口时,它们之间用逗号隔开,例如,下面是一个最简单的接口说明:public interface boy extends person, man
2. 接口体
接口体就是用大括号括起来的那部分。接口体说明接口的成员,包括常量和抽象方法。
interface boy
{
final int MAX=50;
void increment( );
void decrement( );
int currentcount( );
}
像类一样,接口可以有两种成员:成员变量和成员方法。
(1)接口中的成员变量
- 接口中所有的成员变量都隐含的是 public 、static、final 的,因此接口中的成员变量都是静态最终变量。
在接口中成员变量声明的形式如下:
[修饰符 ] 类型名 变量名列表;
例如,在接口中有下面这行代码: “int i=5; ” 等同于: “public static final int i=5; ”
(2)接口中的方法
- 接口中说明的方法都是抽象方法,其声明的形式为: [修饰符 ] 方法返回值类型 方法名(参数列表);
- 由于接口中的方法都是抽象方法, 所以方法体仅仅有一个分号 “ ; ” (连“{” 和“}”都没有)。
- 修饰符可选,它只能是 public 和 abstract。权限修饰符只能是public
- 接口中的所有方法都隐含的是 public 和 abstract 的,接口的方法不能是带static、final 等其他修饰符的
3. 接口的实现
接口的声明仅仅给出了抽象方法,而具体地实现接口所定义的方法需要某个类为接口中的每个抽象方法定义具体的操作。
在类的声明部分,用 implements 关键字来声明这个类实现某个接口,一个类可以实现多个接口,在 implements子句中用逗号隔开。
- 如果实现某接口的类不是 abstract 修饰的抽象类,则必须在类的定义部分实现指定接口的所有抽象方法,即为所有抽象方法定义方法体,而且,方法头部分应该与接口中的定义完全一致,即有完全相同的返回值和参数列表
- 如果实现某接口的类是 abstract 修饰的抽象类,则它可以不实现该接口的所有方法。但是,在这个抽象类的任何一个非抽象的子类中,都必须有它们父类所实现的接口中的所有抽象方法实现的方法体。这些方法体可以来自抽象的父类,也可以来自子类自身。但是不允许存在未被实现的接口方法,这主要体现了非抽象类中不能存在抽象方法的原则。
- 一个类在实现某接口的抽象方法时,必须使用完全相同的方法头。如果所实现的方法与抽象方法有相同的方法名和不同的参数列表,则只是在重载一个新方法,而不是实现已有的抽象方法。
- 接口的抽象方法的访问控制符都已被指定为叫 public,所以类在实现这些抽象方法时,必须显式地使用 public 修饰符,否则将被警告为缩小了接口中定义的方法的访问控制范围。
如:
interface interCalArea
{
double PI=3.14159;
double cal(double r);
}
public class CalArea implements interCalArea
{
public double cal(double r){
return PI*r*r;
}
public static void main(String[] args) {
CalArea CA=new CalArea();
System.out.println("Area="+CA.cal(12.0));
}
}
最后再多说一句:
抽象类和平常我们写的类差不多,只是抽象类不能够被实例化,能够写抽象方法。同时抽象类能够写静态方法,静态成员变量,能够被直接调用。