Java基础-接口

总结一下接口的概念和语法规则,以及比较一下抽象类和接口的异同点。

接口的概念

接口用于声明其实现类所具备的功能,或者说对外所提供的服务,但是不提供具体的实现。

接口的语法规则

(1)接口的成员变量默认都是public、static、final类型的,必须被显式初始化。
(2)接口中的方法默认都是public、abstrat类型的。
(3)接口中只能包含public、static、final类型的成员变量和public、abstract类型的成员方法。
(4)接口没有构造方法,不能被实例化。
在接口中定义构造方法是非法的,例如:

1
2
3
4
public interface C{
public C(){...} //编译出错,接口中不允许定义构造方法
void method();
}

(5)一个接口不能实现另一个接口,但它可以继承多个其他接口。
(6)接口必须通过类来实现它的抽象方法。类实现接口的关键字为implements.
(7)与子类继承抽象父类相似,当类实现了某个接口,它必须实现接口中所有的抽象方法,否则这个类被定义为抽象类。
例如以下CarelessCalculator类没有实现CalculatorIFC接口中的multiply()方法,这会导致编译错误:

1
2
3
4
5
public class CarelessCalculator implements CalculatorIFC{
public double mul(double a,double b){
return a*b;
}
}

正确的做法是,要么把以上mul()方法改名为multiply()方法,要么把CarelessCalculator类声明为抽象类:

1
2
3
4
5
public abstract class CarelessCalculator implements CalculatorIFC{
public double mul(double a,double b){
return a*b;
}
}

(8)不允许创建接口的实例,但允许定义接口类型的引用变量,该变量引用实现了这个接口的类的实例,例如:

1
2
//引用变量t被定义为Transparency接口类型,它引用Glass实例
Transparency t = new Glass();

再例如在营业员Seller类的定义中,cal实例变量被定义为CalculatorIFC接口类型:

1
CalculatorIFC cal;

在Tester类的main()方法中,创建了一个Calculator实例,再把它传给Seller类的构造方法,使得Seller实例的cal实例变量引用这个Calculator实例:

1
2
3
4
5
//引用变量cal被定义CalculatorIFC接口类型,它引用Calculator实例
CalculatorIFC cal = new Calculator();
//把Calculator实例传给Seller类的构造方法
Seller seller = new Seller("铁公鸡",cal);

(9)一个类只能继承一个直接的父类,但能实现多个接口。例如以下MyFrame类的直接父类为Frame,它还同时实现了Runnable和ActionListener接口:

1
2
3
public class MyFrame extends Frame implements Runnable,ActionListener{
...
}

比较抽象类与接口

抽象类与接口都位于继承树的上层,他们具有以下共同点:

  1. 都位于继承树的上层抽象层。
  2. 都不能被实例化。
  3. 都能包含抽象方法,这些抽象方法用于描述类具备的功能,但不必提供具体的实现。
    抽象类与接口主要有两大区别。
    (1)在抽象类中可以为部分方法提供默认的实现,从而避免在子类中重复实现它们,这能提高代码的可重复性,这是抽象类的优势所在;而接口中只能包含抽象方法。
    (2)一个类只能继承一个直接的父类,这个父类有可能是抽象类;但一个类可以实现多个接口,这是接口的优势所在。
    使用接口和抽象类的总的原则如下:
    (1) 接口是软件系统中最高层次的抽象类型。
    (2) 接口本身必须十分稳定,接口一旦制定,就不允许随意修改,否则对接口的实现类及接口的访问类都会造成影响。
    (3) 用抽象类来定制软件系统中的扩展点。可以把抽象类看做是介于“抽象”和“实现”之间的半成品,抽象类力所能及地完成了部分实现,但还有一些功能有待于它的子类去实现。
您的支持将鼓励我努力创作!