文章目录
前言总览(必看)一、接口是“契约”二、接口实例——Servlet接口三、抽象标识符abstract和抽象类四、基类作为“辅助”求支持前言
接口和抽象类?继承和实现?默认方法、静态方法、抽象方法…?这些到底有什么区别和联系?Java新手(包括我这个入门2年的菜鸡)常常都会忽视掉接口的概念,也不会关注抽象类的运用,更别提这两者的差别了…
总览(必看)
对接口、抽象类、基类我做了如下的图来说明:
接口:与其说是不能被实例化的类,更像是一种约定子类可以同时遵守多个约定,实现多个接口
抽象类:是对同类事物共有属性和行为的抽象模板,每个子类只能继承一个模板
基类:是对接口/抽象类默认方法的一般实现,使得子类不需要对接口/抽象类的方法完全重写,更方便使用
一、接口是“契约”
在这里我强调接口是一种“契约”的概念,是从接口这个概念设计的目的出发,尽管从接口的定义方面:如下满足关键字iterface声明,字段内容默认为public static 方法默认public abstract 即可
public interface interfaceName{int STATUS=1;//...void interfaceFunction();//...}
尽管接口定义与一般的类定义差别不但,但是其中字段一般保存不变,方法共有但是不实现这些默认设置,恰巧说明了接口作为“契约”的功能。
声明一个接口——我们使用其静态的字段作为状态标识,默认的方法作为使用该接口的客户和实现该方法的子类的纽带,属于使用者和实现者的约定——这是独属于程序员的浪漫(bushi)
二、接口实例——Servlet接口
Servlet是Java Web开发中较为基础的一个概念,是属于服务器容器和开发者实现后端功能类的一个关键接口
关于Servlet的详细概念和Java Web基础可以参考这篇文章——Java Web 基础之Servlet概念详解
通过上图,我们可以看到Servlet接口,已经默认实现接口功能的基类GenericServlet,然后是Web开发常用类HttpServlet作为子类扩展了Http相关功能。
实现了Servlet接口的类才能被服务器容器识别和部署到服务器上,才能让服务器容器心甘情愿的为开发者设计的类提供服务,Servlet接口就是一种身份标识。
三、抽象标识符abstract和抽象类
有细心的小伙伴可能已经发现了,在接口中所有的方法都默认添加abstract标识,那么这个标识符到底有什么用嘞?
在这里就不得不提到抽象和具体的概念——抽象是现实世界实体的提取概括,不能直接作用于现实世界,具体事物可以由抽象概念组合和创造,可以直接展现使用
因此抽象标识符即表示该方法不能直接使用,需要被子类实现才能使用——同理,抽象类也是如此,抽象类的方法也默认为抽象的方法。具体一个例子如下:
public abstract class Animal{String name;Animal(String name){this.name=name;}@Overridepublic void print(Object document){System.out.println(name);}public abstract void describe();
首先,抽象类可以拥有可变字段和构造方法,而且抽象类还可以继承实现一些父类方法——抽象类可以实现接口方法,抽象类一般用于定义模板,模板方法…比如上面定义了一个动物模板,同样不能实例,但是可以供子类扩展。
四、基类作为“辅助”
在Servlet接口实例中,可以看到——在扩展Servlet接口直接使用时,中间还有一个GenericServlet作为辅助,帮助实现了默认的方法,具体GenericServlet做的工作见下:
abstract class GenericServlet implements Servlet,ServletConfig{//GenericServlet通过将ServletConfig赋给类级变量private trServletConfig servletConfig;public void init(ServletConfig servletConfig) throws ServletException {this.servletConfig=servletConfig;/*自定义init()的原因是:如果子类要初始化必须覆盖父类的init() 而使它无效 这样this.servletConfig=servletConfig不起作用 这样就会导致空指针异常 这样如果子类要初始化,可以直接覆盖不带参数的init()方法 */this.init();}//自定义的init()方法,可以由子类覆盖 //init()不是生命周期方法public void init(){}//实现service()空方法,并且声明为抽象方法,强制子类必须实现service()方法 public abstract void service(ServletRequest request,ServletResponse response) throws ServletException,java.io.IOException{}//实现空的destroy方法public void destroy(){}}
它实现了一大堆空的方法,它的子类就不必对那须不需要实现的方法再进行实现了,减轻了子类的工作。
求支持
作者长期更新分享原创文章,如果觉得本文还算不错的话,请给我一个大大的赞!!!
如果非常赞同这篇文章,请关注我,持续了解更多精彩博文!!!