Java接口与抽象类

时间:2020-01-09 10:35:46  来源:igfitidea点击:

我得到的一个问题是Java接口和抽象类之间的区别是什么,以及何时使用它们。通过电子邮件多次回答了这个问题之后,我决定编写有关Java接口与抽象类的教程。

Java接口用于将某些组件的接口与实现分离。换句话说,使使用接口的类独立于实现接口的类。因此,我们可以交换接口的实现,而不必使用接口更改类。

抽象类通常用作子类扩展的基类。一些编程语言使用抽象类来实现多态性,并将接口与实现分开,但是在Java中,我们为此使用接口。记住,一个Java类只能有1个超类,但是它可以实现多个接口。因此,如果一个类已经具有不同的超类,则可以实现一个接口,但是不能扩展另一个抽象类。因此,接口是用于公开公共接口的更灵活的机制。

如果需要将接口与其实现分开,请使用接口。如果还需要提供接口的基类或者默认实现,请添加实现该接口的抽象类(或者普通类)。

这是一个示例,显示了引用接口的类,实现该接口的抽象类以及扩展该抽象类的子类。

以下是Java抽象类中文本的代码示例,但是添加了一个接口,该接口由抽象基类实现。

首先界面:

public interface URLProcessor {

    public void process(URL url) throws IOException;
}

二,抽象基类:

public abstract class URLProcessorBase implements URLProcessor {

    public void process(URL url) throws IOException {
        URLConnection urlConnection = url.openConnection();
        InputStream input = urlConnection.getInputStream();

        try{
            processURLData(input);
        } finally {
            input.close();
        }
    }

    protected abstract void processURLData(InputStream input)
        throws IOException;

}

第三,抽象基类的子类:

public class URLProcessorImpl extends URLProcessorBase {

    @Override
    protected void processURLData(InputStream input) throws IOException {
        int data = input.read();
        while(data != -1){
            System.out.println((char) data);
            data = input.read();
        }
    }
}

第四,即使实例化的是子类" UrlProcessorImpl",如何使用" URLProcessor"接口作为变量类型。

URLProcessor urlProcessor = new URLProcessorImpl();

urlProcessor.process(new URL("http://Hyman.com"));

同时使用接口和抽象基类可以使代码更灵活。只需将抽象基类作为子类,即可实现简单的URL处理器。如果我们需要更高级的函数,则URL处理器可以直接实现URLProcessor接口,而不能从URLProcessorBase继承。