1.  在java中,类与类之间只能是单继承,而不是多继承。多继承缺点:(1)如果在一个子类继承的多个父类中拥有相同名称的变量,子类在引用该变量时将产生歧义,无法判断应该使用哪个父类的变量;(2)继承的拥有多个相同的方法,子类中又没有覆盖该方法,那么调用该方法时就会产生歧义。Java提供了接口,通过接口的功能实现多继承的优点而摒弃其缺点。

让规范和实现分离正是接口的好处,让软件系统的各组件之间面向接口耦合,是一种耦合(联系)设计。

 软件系统各模块之间也应该采用这种面向接口的耦合,从而尽量减少各模块之间的耦合度,为系统提供更好的可扩展性和可维护性。

2.和类的定义不同,定义接口时不再使用class,而是使用interface,从某个角度看,接口可被看成一个特殊的类,因此一个java源文件里最多只能有一个public接口,如果定义了一个public接口,则该源文件的主文件名就必须与该接口名相同。

 基本语法格式:

       [public]  interface  接口名 [extends 父接口1,父接口2,…]{  //接口支持多继承,多个父接口之间用逗号分隔

      [public][static][final]  数据类型   属性名=常量值;

      [public abstract]   返回值类型 方法名([形参表]);

    1).   接口的属性必须用public static final修饰,是系统默认的,可部分省略或全部省略,但一般都写出final。

int  MAX_SIZE = 50;  等价于

public static final int  MAX_SIZE = 50;

2). 接口的方法默认为publicabstract,一般不写修饰符,可省略--接口中的方法都是抽象方法。

3).接口中的成员变量都是共有的、静态的、最终的常量。接口中的方法都是公共的、抽象的、仅有方法签名、没有方法体。

3. 接口是另一种定义数据类型的方式。它和类非常相似的。

ü    相同之处:都有成员变量和成员方法

  也可以形成继承关系

ü    不同之处:接口中的属性都是常量(final)

             接口中的方法是抽象方法(没有方法体)

引入接口的原因:Java只支持单重继承,每个类只能有一个超类。但实际应用中有时候需要多重继承--使用接口,一个类可以实现多个接口。

4.    接口定义后不能直接创建对象,必须由类实现接口后创建类的对象。每个类只能继承一个基类,但可以实现多个接口。接口不能显示继承任何类,但所有接口类型的引用变量都可以直接赋给Object类型的引用变量。编译器知道任何java对象都比必须是Object或其子类的实例。类定义形式如下:

[public]  class 类名 extends 基类 implements 接口1,…{     //类体    }

      注意:类实现接口,就继承了接口中的所有成员变量和成员方法。由于接口中的方法都是抽象的,因此实现接口的类必须重写这些方法。

5. 注意:

ü    实现接口中的抽象方法时,除去掉关键字abstract外,方法头必须和接口定义中的方法头完全相同,并且public修饰符不能省略。

ü    如果类实现了多个接口,必须重写这些接口中的所有方法。

ü    接口不是类,不能使用new实例化接口,但可以声明接口变量。接口变量可以指向一个实现了该接口的类的对象,例如,
Shape s=new Shape();          //错
Shape s=new Circle();            //对

ü    可以使用instanceof来判断对象是否实现了某个接口。

ü    虽然可以使用接口变量来引用实现接口类的对象,但这种引用只能引用接口的成员,否则会发生编译错误。

强调:一个接口定义一个协定,实现接口的类必须遵守其协定。接口最适合为不相关的类提供通用功能,利用接口提供的方法,程序可以多态地处理这些完全不同的类的对象。

6. 接口和抽象类

µ   接口和抽象类很像,它们都具有如下特征:

ü     接口和抽象类都不能被实例化,它们都位于继承树的顶端,用于被其他类实现和继承。

ü     接口和抽象类都可以包含抽象方法,实现接口或继承抽象类的普通子类都必须实现这些抽象方法。

µ   区别

ü     设计目的不同

接口体现的是一种规范,类似于整个系统的“总纲”,它制定了系统各模块应该遵循的标准。因此一个系统中的接口不应该经常改变

抽象类作为多个子类的共同父类,体现的是模板式设计。抽象类可以被当成系统实现过程中的中间产品,这个中间产品已经实现了部分功能,但这个产品还不能当成最终产品,必须更进一步的完善,这种完善可能有几种不同方式。

ü     用法不同

(1)接口里只能包含抽象方法 ; 抽象类可以包含普通方法

(2)接口里不能定义静态方法 ; 抽象类可以定义静态方法

(3)接口里只能定义静态常量属性 ; 抽象类既包含普通属性,也可以包含静态常量属性

(4)接口不包含构造方法 ; 抽象类里构造方法不用于创建对象,是让子类调用

(5)接口里不能包含初始化块 ; 抽象类可以包含初始化块

(6)一个类可以实现多个接口 ; 一个只能继承一个父类,包括抽象类。