Java_49_接口(interface)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/pmcasp/article/details/82628479

普通类:只有具体实现

抽象类:具体实现和规范(抽象方法)都有

接口:只有规范

为什么需要接口?接口和抽象类的区别?

接口就是比“抽象类”还“抽象”的“抽象类”,可以更加规范的对子类进行约束。

全面的专业的实现了:规范和具体实现的分离。

抽象类还提供某些具体实现,接口不提供任何实现,接口中所有方法都是抽象方法。接口是完全面向规范的,规定了一批类具有的公共方法规范。

从接口的实现者角度看,接口定义了可以向外部提供的服务。

从接口的调用者角度看,接口定义了实现者能提供那些服务。

接口是两个模块之间通信的标准,通信的规范。如果能把你要设计的系统之间模块之间的接口定义好,就相当于完成了系统的设计大纲,剩下的就是添砖加瓦的具体实现了。大家在工作以后,做系统时往往就是使用“面向接口”的思想来设计系统。

如何定义接口?

格式:[访问修饰符] interface 接口名 [extends 父接口1,父接口2...]{常量定义、方法定义}

访问修饰符:只能是public或者默认。

接口名:和类名采用相同命名机制。

extends:接口可以多继承。

常量:接口中的属性只能是常量,总是:public static final 修饰。【不写也是】

方法:接口中的方法只能是:public abstract 修饰。【不写也是】

接口中的static方法可以通过 接口名[interfaceName].[staticName]();调用。

接口中的default方法在即在不破坏java现有实现架构的情况下能往接口里增加新方法。

JDK8

(1)增加default方法。对已有的接口,如果想对接口增加一个新方法,那么需要对实现该接口的所有类进行修改,如果接口实的现类很多,就会带来很大的工作量,而且还很容易破坏以前的代码,带来一些问题。如果把新的方法定义为default方法,就可以避免对其他实现类的修改。

但是,这样也会有一个问题:如果接口A和接口B里有一个名字相同并且参数列表也相同的方法都被定义为了default方法,那么当类C实现接口A和接口B的时候就会在编译时报错。由于是编译时报错,这个完全可以接受,当类C成功实现了

接口A和接口B以后(没有冲突),类C的实例就可以调用接口A和接口B里的default方法了。

(2)新增了static函数。static修饰的方法也是非抽象方法,有自己的方法体,在接口中定义一个静态方法,该方法可以直接用< 接口名.方法名() >的形式来调用。相当于调用类的静态方法一样,给方法的调用带来了方便。

接口的本质讨论

接口就是规范,定义的是一组规则,体现了现实世界中“如果你是...则必须能...”的思想。如果你是天使,则必须能飞。如果你是汽车,则必须能跑。如果你是好人,则必须干掉坏人。如果你是坏人,则必须欺负好人。

接口的本质就是契约,就像我们人间的法律一样。定制好后大家遵守。

OO(Object Oriented)的精髓,是对对象的抽象,最能体现这一点的就是接口。为什么我们讨论设计模式都值针对具备了抽象能力的语言(比如 c++、java、c#等),就是因为设计模式所研究的,实际上就是如何合理的去抽象。

接口使用要点

1.子类通过implements来实现接口中的规范。

2.接口不能创建实例,但是可用于声明引用变量类型。

3.一个类实现了接口,必须实现接口中所有的方法,并且这些方法只能是public的。

4.接口中只能包含静态常量、抽象方法,不能有普通属性、构造方法、普通方法。

5.常量必须是:public static final 我们不写,系统默认也是这样。

6.方法必然是:public abstract 我们不加这些修饰,系统也是这样。

7.接口完全支持多继承。和类的继承类似,子接口扩展某个父接口,将会获得父接口中所定义的一切。

使用调用接口后类的方法或属性需要强制转型,同等与多态【className Test1=(className)Test】

接口可以继承接口并且可以多继承interfaceName extends interfaceName01,interfaceName02...

实现也可以多个接口className implements interfaceName01,interfaceName02...

以下测试

public class Test2 implements ccc{

    @Override
    public void aaa() {
        // TODO Auto-generated method stub
        
    }

    @Override
    public void bbb() {
        // TODO Auto-generated method stub
        
    }

    @Override
    public void ccc() {
        // TODO Auto-generated method stub
        
    }

}
interface aaa{
    void aaa();
}
interface bbb{
    void bbb();
}
interface ccc extends aaa,bbb{
    void ccc();
}

猜你喜欢

转载自blog.csdn.net/pmcasp/article/details/82628479