4.5接口

1.接口的概念
我们经常在生活中听到接口这个词,比如PCI接口、AGP接口,因此很多人认为接口相当于主板上一个插槽,这其实是一种错误的认识。当说PCI接口时,指的是主板上那个插槽遵守了PCI规范,而具体的PCI插槽只是PCI接口的实例。

对于不同型号的主板而言,各自的PCI插槽都需要遵守一个规范。对于同一个型号的不同主机板而言,它们的PCI插槽需要有相同的数据交换方式、相同的实现细节,它们都是同一个类的不同实例。

同一个类的内部状态数据、各种方法的实现细节完全相同,类是一种具体实现体。而接口定义了一种规范,接口定义了某一批类所需要遵守的规范,接口不关心这些类的内部状态数据,也不关心这些类里方法的实现细节,它只规定这批类里必须提供某些方法,提供这些方法的类就可以满足实际需要。

让规范和实现分离正是接口的好处,让软件系统的各组件之间面向接口耦合,是一种松耦合的设计。例如主板上提供的PCI插槽,只要一块显卡遵守PCI接口规范,就可以插入PCI插槽内,与该主板正常通信。

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

因此,接口定义的是多个类共同的行为规范,这些行为是与外部交流的通道,这就意味着接口里通常是定义一组公用方法。
2.接口的定义interface
部分转载至http://blog.csdn.net/OREO_GO/article/details/52102514?locationNum=4&fps=1
- 接口与类属于同一个层次,接口的作用是为了实现多重继承。

  • 接口中的成员变量有默认的public static final 属性,并且这些常量在定义时要赋值,成员方法有默认的public abstract属性。

  • 一个类实现一个接口要实现这个接口的所有抽象方法,否则该类为抽象类。实现接口的抽象方法时,方法的名称,方法的参数和返回值要完全相同。一个类可以实现多个接口。

  • 接口中的抽象方法默认访问权限为public 所以子类中实现的抽象方法访问权限不能缩小。

  • 只有在Java 8 以上的版本中才允许在接口中定义默认方法、类方法。默认方法使用default修饰,类方法使用static修饰。

3.多重继承

  • 在java中一个类只能有一个直接父类,而接口则不同,一个接口可以继承多个接口。一个类也可以实现(implements)多个接口。

示例

interface I1{
    void aa();//interface中的方法均为抽象方法(只有声明部分,没有实现部分!)
}
interface I2{
    void aa();
    void bb();
    public static void dd(){}//定义的类方法
    default void ee(){}//定义的默认方法
}
abstract class A{
    abstract void cc();
}
class C extends A implements I1,I2{
    public void aa(){
        System.out.println("aa");//继承接口的方法并重写实现这个方法体现了多态!
    }
    public void bb(){//这里的public不能省略(在类中实现抽象方法时其访问限制属性不能缩小!)
        System.out.println("bb");

    }
    void cc(){
        System.out.println("cc");
    }
}
public class InterfaceTest {
public static void main(String args[]){
    I1 t=new C();
    t.aa();
    I2 t2=new C();
    t2.bb();
    t2.aa();
    A a=new C();
    a.cc(); 
}
}

4.使用接口
接口不能创建实例,但是可以创建一个引用类型来引用实现类的实例。接口和抽象类都是主要就是为了让类实现(继承)接口。
归纳起来,接口主要有如下用途。
①定义变量,也可用于进行强制类型转换。

②调用接口中定义的变量。

③被其他类实现。
一个类实现某个接口时,该类将会获得从接口中定义的常量(成员变量)、方法等,因此可以把实现接口理解为一种特殊的继承,相当于实现类继承了一个彻底抽象的类(相当于除了默认方法之外,所有方法都是抽象方法的类)。
示例

interface interfaceA
{
    int PROP_A = 5;
    void testA();
    public static void aa(){//接口A中的类方法
        System.out.println("A类方法");
    }
}
interface interfaceB
{
    int PROP_B = 6;
    void testB();
    default void bb(){//接口B中的默认方法
        System.out.println("B默认方法");
    }
}
class C implements interfaceA , interfaceB
{
    int PROP_C = 7;
    public void testA(){
        System.out.println("接口A");
    };
    public void testB(){
        System.out.println("接口B");
    }
}

public class Test
{
    public static void main(String[] args)
    {
        interfaceA t1=new C();//接口的引用指向实现类的实例
        interfaceB t2=new C();
        t1.testA();//调用C中的重写方法
        t2.testB();
        t2.bb();//调用接口B中的默认方法
        System.out.println(C.PROP_A);
        System.out.println(C.PROP_B);
    }
}

5.接口和抽象类
接口和抽象类很像,它们都具有如下特征:
①接口和抽象类都不能被实例化,它们都位于继承树的顶端,用于被其他类实现和继承。

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

但接口和抽象类之间的差别非常大,这种差别主要体现在二者设计目的上。下面具体分析二者差别。

接口作为系统与外界交互的窗口,接口体现的是一种规范。 方法的形式来提供);对于接口的调用者而言,接口规定了调用者可以调用哪些服务,以及如何调用这些服务(就是如何来调用方法)。当在一个程序中使用接口时,接口是多个模块间的耦合标准,当在多个应用程序之间使用接口时,接口是多个程序之间的通信标准。

从某种程序来看,接口类似于整个系统的“总纲”,它指定了系统各模块之间应遵循的标准,因此一个系统中的接口不应该经常改变。一旦接口被改变,对整个系统甚至其他系统影响将是辐射式的。

抽象类则不一样,抽象类作为系统中多个子类的共同父类,它所体现的是一种模板式的设计。抽象类作为多个子类的抽象父类,可以被当成系统实现过程中的中间产品,这个中间产品已经实现的系统的部分功能(那些已经提供实现的方法),但这个产品依然不能当成最终产品,必须有更进一步的完善,这种完善可能有几种不同方式。

除此之外,接口和抽象类在用法上也存在如下差别。
①接口里只能包含抽象方法,不能为普通方法提供方法实现(默认方法可以提供方法实现);抽象类则可以包含普通方法。

②接口里只能定义常量,不能定义普通成员变量;抽象类里则即可以定义普通成员变量,也可以定义静态常量。

③接口里不包含构造器;抽象类可以包含构造器,抽象类里的构造器并不是用于创建对象,而是让其子类调用这些构造器来完成属于抽象类的初始化操作。

④接口里不能包含初始化块;但抽象类则可以完全包含初始化块

⑤抽象类和普通类一样,只能继承一个父类,但不能继承接口;接口可继承多个父接口,但不能继承类。

⑤一个类只能有一个直接父类,包括抽象类;但一个类可以实现多个接口,通过实现多个接口可以弥补Java单继承的不足。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值