Java 面向对象程序设计 接口
接口(interface)是用来实现类间多重继承功能的一种结构。它定义了若干个抽象方法和常量,形成一个属性集合,该属性集合通常对应了某一组功能。
凡是需要实现这种特定功能的类,都可以继承并使用它。一个类只能直接继承一个父类,但可以同时实现若干个接口。实现(或继承)接口实际上就获得了多个特殊父类的属性,即实现了多重继承。
1.接口与继承
接口定义的仅仅是实现某一特定功能的一组对外的协议和规范,而并没有真正地实现这个功能。这些功能的真正实现是在继承这个接口的各个类中完成的。
因为接口包含的是未实现的一些抽象的方法,它与抽象类有些相象。它们之间存在以下的区别:
- 接口不能有任何实现了的方法,而抽象类可以。
- 类可以继承(实现)许多接口,但只能继承一个父类。
- 类有严格的层次结构,而接口没有层次结构,没有联系的类可以实现相同的接口。
2.接口的定义
接口是由常量和抽象方法组成的特殊类。接口的定义包括两个部分:接口声明和接口体。声明接口一般格式如下:
[public] interface 接口名 [extends 父接口名表 ] { 域类型 域名=常量值; //常量域声明 返回值 方法名(参数表); //抽象方法声明 }
接口声明中有两个部分是必需的:interface关键字和接口的名字。用public修饰的接口是公共接口,可以被所有的类和接口使用;没有public修饰符的接口则只能被同一个包中的其他类和接口利用。
接口也具有继承性,子接口可以继承父接口的所有属性和方法,同时一个子接口可以继承多个父接口。
3.接口的实现
定义接口是为了让某些类实现它。 一个类实现某个接口,要在类的声明中要包括一条implements语句,并提供在接口中定义的所有抽象方法的具体实现。
一个类可以实现多个接口,可以在implements后面列出要实现的多个接口,这些接口以逗号分隔。
interface calculate{ int number = 100; void add(int s,int b); void mul(int a,int b); } public class TheInterface implements calculate{ @java.lang.Override public void add(int s, int b) { System.out.println(s+b); } @java.lang.Override public void mul(int a, int b) { System.out.println(a*b); } public static void main(String[] args) { TheInterface myinterface = new TheInterface(); myinterface.add(1,3); myinterface.mul(55,1); System.out.println(myinterface.number); } } //输出 //4 //55 //100
实现接口时应注意的问题:
(1)在类的声明部分,用implements关键字声明该类将要实现哪些接口。
(2)类在实现抽象方法时,必须用public修饰符。
(3)除抽象类以外,在类的定义部分必须为接口中所有的抽象方法定义方法体,且方法首部应该与接口中的定义完全一致。
(4)若实现某接口的类是abstract的抽象类,则它可以不实现该接口所有的方法。但是对于这个抽象类的任何一个非抽象子类,不允许存在未被实现的接口方法。即非抽象类中不能存在抽象方法。
接口的实例
interface Shape2 { public abstract double computeArea(); } class Circle2 implements Shape2 { double radius; String type = "Circle"; public Circle2(double _radius) { radius = _radius; } public double computeArea() { return Math.PI * radius * radius; } void Circle2(){ System.out.println(computeArea()); } } class Rectangle2 implements Shape2 { double width, height; String type = "Rectangle"; public Rectangle2(double _width, double _height) { width = _width; height = _height; } public double computeArea() { return width * height; } void Rectangle2(){ System.out.println(computeArea()); } } public class ShapeTestWithInterface { public static void main(String args[]) { Circle2 c1 = new Circle2(2); Rectangle2 r1 = new Rectangle2(2,2); c1.Circle2(); r1.Rectangle2(); } }