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继承。