接口和抽象类

来源:互联网 发布:恒大淘宝内部组织架构 编辑:程序博客网 时间:2024/05/21 10:26

接口是服务提供者(服务器)和服务的用户(客户端)之间的一个协议。有时候服务器定义协议,有时候则是客户端定义协议。
接口既可以定义域也可以定义方法,但是接口中的方法没有实现。要想让他发挥作用,接口必须得有真正执行这个动作的实现类。

就像类一样,接口也有public或者缺省访问级别。接口可以有域和方法,不过所有的接口都是隐式公开的。

package app09;public interface Printable {    void print(Object o);   //接口中的方法没有主体,会被分号直接中止。}

就像类一样,接口也是创建对象的模板。但是和普通的类不一样的是接口不能被实例化,他只是定义了Java类可以实现的一组方法。

package app09;public class CanonDriver implements Printable {    public void print(Object obj) {        // code that does the printing    }}

实现类必须覆盖接口中的所有方法。接口和他的实现类之间的关系可以比作父类和子类的关系,实现类的实例也是接口的实例。
接口支持继承,一个接口可以扩展另一个接口。


有了接口就必须编写执行实际动作的实现类。如果接口中有许多方法,可能会浪费时间去覆盖用不到的方法。抽象类的作用和接口类似,但是抽象类同时还能提供部分实现。必须要显式覆盖的方法可以声明为abstract。不过仍需要创建实现类,因为抽象类不能被实例化,但无需覆盖不想使用或者不想修改的方法。
通过在类声明中使用abstract修饰符来创建抽象类,可以在方法声明之前使用abstract修饰符来创建抽象方法。

package app09;public abstract class DefaultPrinter {    public String toString() {        return "Use this to print documents.";    }    public abstract void print(Object document);}

toString方法有一个实现,这样就不需要在实现类中覆盖这个方法了,除非你想改变他的返回值。print方法声明为abstract,没有主体。

package app09;public class MyPrinter extends DefaultPrinter {    public void print(Object document) {        System.out.println("Printing document");        //some code here    }}

像MyPrinter这样的具体实现类必须覆盖所有的抽象类,否则它自己必须声明为abstract。
将一个类声明为abstract就是告诉类的用户,你想让他们扩展这个类,即使某个类没有抽象的方法,但仍可以将其声明为abstract。

0 0
原创粉丝点击