接口(interface)
接口类似于class,但与class的单继承不同,一个interface可以继承于多个interface。Interface的一般形式是常量(如果需要的话)和方法签名(method signatures, 没有方法体)的集合,例如:
- interface Bicycle extends Interface1, Interface2, Interface3,… {
- // constant declarations, if any.
- // method signatures
- void changeCadence(int newValue);
- void changeGear(int newValue);
- void speedUp(int increment);
- void applyBrakes(int decrement);
- }
注1:接口的访问权限默认为package private,即只有同一package内的class可访问。
注2:接口里定义的方法的访问权限默认是public的。
注3:接口里定义的方法隐含都是abstract的,可以但不必要加上abstract修饰符。
接口本身不能被实例化,只能被其他类实现, 或者extended by other interfaces。
接口实现的一般形式:
- class ACMEBicycle implements Bicycle {
- // 分别实现接口里的method signatures
- }
在Java编程中,一个class 只能继承于一个class,而一个 class可以实现多个interface,好比一台计算机从集成电路继承而来,可以实现USB、COM、RJ45、RS232等多种接口。所以,一个对象可以有多种类型:它自己所实例化的class或它所实现的任意一个interface( using an interface as a type)。如果一个变量声明为一个interface类型,那么它就可以引用(指向)任意一个实现了此interface的class的对象(use an interface as a class)。
public class TestInterface {
public static void main(String[] args){
AClass myClass = new AClass();
AnInterface myInterface = myClass;
myInterface.sayHello();
}
}
interface AnInterface{
void sayHello();
}
class AClass implements AnInterface {
public void sayHello(){System.out.println("Hello!");}
}
如果你的类(non-abstract class)被声明implements一个接口,那么就必须在这个类中实现接口所定义的所有方法。
抽象类与接口的区别
接口是一种特殊的抽象类,它是只含有函数签名(如有必要,再加上常量形式的成员变量)的抽象类。
1、 抽象类可以含有除static、final之外的其他成员变量。接口的成员变量只能是常量。
2、 抽象类中可以有非抽象方法部分实现,再由其子类完成更多实现。而接口中只能含有抽象方法,所有方法都不得有方法体(即使空方法体{}也不行),完全通过其它类来全部实现接口。如果一个抽象类中只有抽象方法,那么此类就可以声明为接口。
3、 多个接口可以由毫不相关的任意类实现,而抽象类逻辑上一般由它的子类继承实现。例如:
The GraphicObject
class can look something like this:
- abstract class GraphicObject {
- int x, y;
- ...
- void moveTo(int newX, int newY) {
- ...
- }
- abstract void draw();
- abstract void resize();
- }
GraphicObject
, such as Circle
and Rectangle
, must provide implementations for the draw
and resize
methods:(含有abstract方法的类一定是abstract类)
- class Circle extends GraphicObject {
- void draw() {
- ...
- }
- void resize() {
- ...
- }
- }
- class Rectangle extends GraphicObject {
- void draw() {
- ...
- }
- void resize() {
- ...
- }
例如:
- abstract class X implements Y { //Y is a interface
- // implements all but one method of Y
- }
- class XX extends X {
- // implements the remaining method in Y
- }
X
must be abstract
because it does not fully implement Y
, but class XX
does, in fact, implement Y
.